
Spring ⑦ 循环引用问题
Spring 源码系列文章会遵循由浅入深,由易到难,由宏观到微观的原则,目标是尽量降低学习难度,而不是一上来就迷失在源码当中. 文章会从一个场景作为出发点,针对性的目的性极强的针对该场景对 Spring 的实现原理,源码进行探究学习。该系列文章会让你收获什么? 从对 Spring 的使用者成为 Spring 专家。该文章会同步在微信公众号 【DevXJava】, 方便在微信客户端阅读。
Bean 的实例化初始化顺序
场景
/**
* Add the given singleton object to the singleton cache of this factory.
* <p>To be called for eager registration of singletons.
* @param beanName the name of the bean
* @param singletonObject the singleton object
*/
protected void addSingleton(String beanName, Object singletonObject) {
synchronized (this.singletonObjects) {
this.singletonObjects.put(beanName, singletonObject);
this.singletonFactories.remove(beanName);
this.earlySingletonObjects.remove(beanName);
this.registeredSingletons.add(beanName);
}
}
到这里 spring 是如何处理循环引用的原理我们就讲完了,接下来看如果在使用过程中出现了循环引用该如何解决. (最好的办法就是不要循环引用,这个就涉及到项目结构设计,编码规范等等方面,这里并不展开。).
解决循环引用
解决循环引用的思路是
延迟加载让 bean 在真正被使用时再去加载,这样做的缺点是会有一点性能损耗一般情况下可以忽略不计. 可以通过使用@Lazy注解的方式或者注入ObjectFactory或ObjectProvider或jsr-330Provider的方式实现懒加载.

总结
本章讲解了 构造器依赖注入时循环引用 和 属性方法依赖注入时循环引用 的场景。在构造器注入时得到的依赖项是经过了完整的初始化过程的,可以说是得到的一个完整的 bean 。而属性或方法注入的场景得到的 bean 是没有经过完全初始化的,所以在使用 bean 时需要警惕.
抱歉最近没有更新因为我在追剧,其实我最近在考虑要不要转行卖鱼了 : )

DevX 会持续分享 Java 技术干货,如果你觉得本文对你有帮助希望你可以分享给更多的朋友看到。该文章会同步在微信公众号 【DevXJava】, 方便在微信客户端阅读。
DevX 不止于技术

本篇文章来源于微信公众号: DevXJava
微信扫描下方的二维码阅读本文

Comments NOTHING