spring容器管理对象和new对象
本文来说下spring容器管理对象和new对象之间的区别与联系
文章目录
- 流程图说明Spring注入的对象和new的对象区别
- 普通的创建new对象
- 交由spring ioc容器进行管理
- Spring的 IOC 容器比New对象究竟好在哪
- new 对象里面使用自动注入对象会报空指针异常
- 本文小结
流程图说明Spring注入的对象和new的对象区别
普通的创建new对象
在获取对象时都是采用new的方式,是属于主动的
交由spring ioc容器进行管理
spring在获取对象时,同时跟工厂要,有工厂就查找或者创建对象,是属于被动的
Spring的 IOC 容器比New对象究竟好在哪
ioc的思想最核心的地方在于,资源不由使用资源的双方管理,而由不使用资源的第三方管理,这可以带来很多好处。
- 资源集中管理,实现资源的可配置和易管理。
- 降低了使用资源双方的依赖程度,也就是我们说的耦合度。
IOC思想
java程序中的每个业务逻辑至少需要两个或以上的对象来协作完成,通常,在使用其他的合作对象时,均要使用像new object这样的语法来完成合作对象的申请工作。你会发现:对象间的耦合度高了。而IOC的思想是:Spring容器来实现这些相互依赖对象的创建、协调工作。对象只需要关心业务逻辑本身就可以了。IOC是基于java的反射机制以及工厂模式实现的。
Inversion of Control(控制反转)是一种设计思想,就是容器控制应用程序所需要外部资源的创建和管理,然后将其反转给应用程序。对象及其依赖对象的创建及维护都不需要在应用程序中实现,将其交给IOC容器去管理。传统的开发中,我们自己在对象内部创建依赖对象并注入当前对象,完成依赖关系的维护;对于IOC而言,它强调是将主动变为被动,由IOC容器来负责依赖对象的创建和查找,由IOC容器来进行注入组合对象,我们只需要在相关的配置文件中维护对象之间的依赖关系即可。
new对象
平时new A()时候是要import包地址的,这就已经写死了,以后这个引用就死死的指向了那个类,想改变很麻烦,用ac.getbean(“A”)就没引入包,也就是所谓的不依赖 (就是跟那类A没关系),它只从容器找那个叫A的类,至于你给我的是啥,看容器中咋配置。
举个例子:比如说是个很常用的dao类,开始你new的很开心,万一以后需求大改,数据库mysql换db2了,这个dao文件基本就得重写,如果这个类已经封装编译为class文件,不能改了怎么办。又或者你实例化了一个常用接口。
原来那个实现类A不好,要换成B做他的实现类,重写他的方法。你就得把项目中所有实例化的地方都找出来,再改成B(大项目用了很多的话你就一个一个改类似,万一漏了就是不小的bug)。用ioc就没这个麻烦,直接在配置文件中将叫A的bean指向你新写的类就可以。
new 对象里面使用自动注入对象会报空指针异常
根本原因在于当Spring框架帮我们管理的时候就会自动的初始化接下来会用到的属性,而通过new对象的方式,在该new对象中使用到的一些实例就需要自己去做初始化,否则就会报空指针异常。
如下例子所示:TestService 通过@Autowired注入,那么Spring容器就会自动注入TestService 中会用到的TestDao。
@RestController
@RequestMapping(value = "/test")
public class TestController {@Autowiredprivate TestService testService;@RequestMapping(value = "/print",method = RequestMethod.GET)public void test() {testService.test();}
}@Service
public class TestService {@Autowiredprivate TestDao testDao;public void test() {testDao.test();}
}
如果TestService 通过new对象方式新建的话,Spring容器就不会自动注入TestDao,此时testDao为null,会报空指针异常。此时就需要在TestService中自己new一个TestDao对象。如例二所示。
@RestController
@RequestMapping(value = "/test")
public class TestController {private TestService testService = new TestService ();@RequestMapping(value = "/print",method = RequestMethod.GET)public void test() {testService.test();}
}@Service
public class TestService {@Autowiredprivate TestDao testDao;public void test() {TestDao testDao = new TestDao ();testDao.test();}
}
小结
在程序启动时,Spring会按照一定的加载链来加载并初始化Spring容器中的组件。
例如:在A中注入B,B中注入C。在A中调用B,来使用B中调用C的方法时,如果不采用自动注入,而是使用new对象方式的话,就会报空指针异常(因为B中的C并没有被初始化)。
本文小结
其实spring容器管理对象和new对象,最重要的区别就是IOC容器可以看作第三方的中介,管理着所有的bean以及bean之间的关系,当程序中需要对象的时候,直接去容器中拿就可以了,这样就极大的降低了程序的耦合度,利于代码的编写与维护,所以在程序中,一般看到的都是controller,dao和service这3层。如果直接new的话,程序之间是强耦合,因为使用一个类的时候,是需要导包的,这样维护与修改并不是十分的方便。
spring容器管理对象和new对象相关推荐
- spring boot获取spring容器中的bean对象
我们知道如果我们要在一个类使用 spring提供的bean对象,我们需要把这个类注入到spring容器中,交给spring容器进行管理,但是在实际当中,我们往往会碰到在一个普通的Java类中,想直接 ...
- 在Spring容器外部连接对象依赖项
有几种有趣的方法可以设置在Spring容器外部实例化的对象的属性和依赖关系. 用例首先,为什么我们需要在Spring容器之外进行依赖注入–我知道三个用例,其中我实例化了Spring容器之外的对象并需要 ...
- java 从一个容器获取对象,Java 如何实现从spring容器中获取注入的bean对象
Java 如何实现从spring容器中获取注入的bean对象 发布时间:2020-11-03 15:27:37 来源:亿速云 阅读:70 作者:Leah 这期内容当中小编将会给大家带来有关Java 如 ...
- SpringBoot项目中如何在静态工具类中使用被Spring容器管理的对象
在开发的过程中,难免会碰到需要在工具类中使用由spring管理的对象的情况,但是我们都知道,工具类中的静态方法中无法引用spirng容器中的对象(被spring管理的对象不是静态的,静态方法中无法调用 ...
- 请简述什么是spring的ioc和di_小编Spring是什么、spring容器、IOC和DI
1.Spring (1)Spring是什么? 是一个轻量级的.用来简化企业级应用开发的开发框架. 注: a.简化开发: Spring对常用的api做了简化,比如,使用Spring jdbc来访问数据库 ...
- Spring学习第3篇:Spring容器的基本使用
大家家好,我是一名网络怪咖,北漂五年.相信大家和我一样,都有一个大厂梦,作为一名资深Java选手,深知Spring重要性,现在普遍都使用SpringBoot来开发,面试的时候SpringBoot原理也 ...
- 【SpringBoot】在普通类中获取spring容器中的bean
这段时间公司搞封闭开发,做一个联通总部的客服系统项目,是基于springboot的.在开发工程中遇到一个页面datagrid数据排序的功能,因为有多个表的数据都要用到排序功能,于是我就写了一个排序功能 ...
- Spring —— 容器内部逻辑
引言 上一篇关于IoC容器的详解<Spring -- IoC 容器详解>真是工程浩大,可以说Spring官网对核心中的核心IOC容器做了非常全面的使用说明,包括在<Spring揭秘& ...
- Spring容器,控制反转,依赖注入
Spring boot学习之旅,为更好督促自己学习以记之,仅供参考. spring容器 程序启动的时候会创建spring容器,扫描给spring容器一个清单,比如:@Controller, @Bean ...
最新文章
- Windows程序设计学习笔记(1):一个简单的windows程序
- 一致性哈希(Consistent Hashing)
- Linux下用C语言最基本的程序开发与调试
- [2015-11-10]iis远程发布配置
- .NET:命令行解析器介绍
- labview叠加白噪声_强化学习中Ornstein-Uhlenbeck噪声是鸡肋吗?
- 红米路由器ac2100怎样设置ipv6_红米(Redmi)路由器AC2100手机怎么设置?
- php在双引号中输出变量要加大括号,php中输出变量加大括号{}作用_PHP教程
- JSF的web.xml配置
- 三星S7 android操作系统耗电,2K屏手机玩游戏耗电大、性能渣?三星S7:呵呵
- java日志——基本日志+高级日志
- oracle 安装display,Linux安装Oracle 11时报错DISPLAY解决方案
- Java预科篇1-学前
- android view 画文字,【Android自定义View】绘图之文字篇(三)
- 使用nssm管理Windows服务
- word中图片为嵌入式格式时显示不全_毕设时,在word中插入图片时,图片的格式改为嵌入式后图片藏于文字下方怎么办?...
- 这本书非常值得一读!《微习惯》读后感
- 2018某二本的秋招流水帐
- 阻抗匹配50欧姆的由来
- 使用开源的协同办公OA项目,实现规范高效的公文管理