spring注入
接口注入,构造器注入,setter注入
接口注入(springboot支持)
即注解注入,在持久层,业务逻辑层,控制层的实现类上面分别加上@Repository,@Service,@Controller;在中立的类上加上@Component注解
构造器注入
bean管理的对象必须实现无参构造,否则不能创建对象。
然后在核心配置文件中,配置构造器注入
setter注入
创建DAO类和属性,提供get,set方法
创建Service类,创建DAO类型的成员变量,,提供get,set方法
在bean.xml中配置
转载于:
https://www.jianshu.com/p/1f55a652f017
构造注入与setter注入有什么区别?
- setter注入可以实现部分注入,构造器注入不能部分注入。
- 当setter注入和构造器注入都存在时,setter注入可以覆盖构造器注入。【构造器注入又被称为创建实例的第一项】
- setter不能保证所有的依赖都被注入,而构造器注入必须依赖都注入才会创建实例
- 构造器注入会产生A依赖于B,B又依赖于A,创建对象的时候会报出对象循环不能创建异常(ObjectCurrentlyInCreationException)。setter注入不会存在这种问题。
【Spring setter 注入是如何解决循环依赖问题的? 构造注入为啥解决不了循环依赖?】
1 注入是如何解决循环依赖问题的? 构造注入为啥解决不了循环依赖?
构造注入解决不了:因为构造方法创建实例,每次都要new一个要构造的实例bean,而A创建时,依赖B,就去创建B,B又依赖了A,继续构造A,如此循环下去 A(B) B(A) A(B)->…
设值注入:使用三级缓存来解决循环依赖问题;构造的对象使用无参构造方法,会把A先放入二级缓存(前置也会把A的工厂方法放到三级缓存),后面B,会从二级缓存中获取A(中间态)完成属性设置,B就直接进入了一级缓存中,递归回A,最后也进入一级缓存。
2 源码位置
1级放成品
2级是中间态
3级是lamb工厂方法
部分资料参考
https://blog.csdn.net/qfzhangwei/article/details/109849289
什么时候使用构造器注入,什么时候使用setteer注入?
两种依赖注入都可以,最好的方案时强制依赖选择构造器注入,可选依赖选择setter注入。