Spring IOC容器中那些鲜为人知的细节

2021-04-13 03:27

阅读:460

技术图片

技术图片

技术图片

技术图片

技术图片

技术图片

在 上 面 获 取 给 定 Bean 的 实 例 对 象 的 getObjectForBeanInstance() 方 法 中 , 会 调 用FactoryBeanRegistrySupport 类的 getObjectFromFactoryBean()方法,该方法实现了 Bean 工厂生产 Bean 实例对象。Dereference(解引用):一个在 C/C++中应用比较多的术语,在 C++中,”*”是解引用符号,而”&”是引用符号,解引用是指变量指向的是所引用对象的本身数据,而不是引用对象的内存地址。

3、AbstractBeanFactory 生产 Bean 实例对象
AbstractBeanFactory 类中生产 Bean 实例对象的主要源码如下: 
技术图片

技术图片

技术图片

从上面的源码分析中,我们可以看出,BeanFactory 接口调用其实现类的 getObject 方法来实现创建Bean 实例对象的功能。
 
4、工厂 Bean 的实现类 getObject 方法创建 Bean 实例对象
 
FactoryBean 的实现类有非常多,比如:Proxy、RMI、JNDI、ServletContextFactoryBean 等等,FactoryBean 接口为 Spring 容器提供了一个很好的封装机制,具体的 getObject()有不同的实现类根据不同的实现策略来具体提供,我们分析一个最简单的 AnnotationTestFactoryBean 的实现源码:
技术图片
其他的 Proxy,RMI,JNDI 等等,都是根据相应的策略提供 getObject()的实现。这里不做一一分析,这已经不是 Spring 的核心功能,感兴趣的小伙可以再去深入研究。
 
再述 autowiring
 
Spring IOC 容器提供了两种管理 Bean 依赖关系的方式:
1)、显式管理:通过 BeanDefinition 的属性值和构造方法实现 Bean 依赖关系管理。
2)、autowiring:Spring IOC 容器的依赖自动装配功能,不需要对 Bean 属性的依赖关系做显式的声明,只需要在配置好 autowiring 属性,IOC 容器会自动使用反射查找属性的类型和名称,然后基于属性的类型或者名称来自动匹配容器中管理的 Bean,从而自动地完成依赖注入。通过对 autowiring 自动装配特性的理解,我们知道容器对 Bean 的自动装配发生在容器对 Bean 依赖注入的过程中。在前面对 Spring IOC 容器的依赖注入过程源码分析中,我们已经知道了容器对 Bean 实例对象的属性注入的处理发生在 AbstractAutoWireCapableBeanFactory 类中的 populateBean()方法中,我们通过程序流程分析 autowiring 的实现原理:
 
1、AbstractAutoWireCapableBeanFactory 对 Bean 实例进行属性依赖注入
应用第一次通过 getBean()方法(配置了 lazy-init 预实例化属性的除外)向 IOC 容器索取 Bean 时,容器创 建 Bean 实 例 对 象 , 并 且 对 Bean 实 例 对 象 进 行 属 性 依 赖 注 入 ,AbstractAutoWireCapableBeanFactory 的 populateBean()方法就是实现 Bean 属性依赖注入的功能,其主要源码如下: 
技术图片

技术图片

2、Spring IOC 容器根据 Bean 名称或者类型进行 autowiring 自动依赖注入 
 
技术图片

 技术图片

通过上面的源码分析,我们可以看出来通过属性名进行自动依赖注入的相对比通过属性类型进行自动依赖 注 入 要 稍 微 简 单 一 些 , 但 是 真 正 实 现 属 性 注 入 的 是 DefaultSingletonBeanRegistry 类 的registerDependentBean()方法。

3、DefaultSingletonBeanRegistry 的 registerDependentBean()方法对属性注入

技术图片

技术图片

通过对 autowiring 的源码分析,我们可以看出,autowiring 的实现过程:
a、对 Bean 的属性代调用 getBean()方法,完成依赖 Bean 的初始化和依赖注入。
b、将依赖 Bean 的属性引用设置到被依赖的 Bean 属性上。
c、将依赖 Bean 的名称和被依赖 Bean 的名称存储在 IOC 容器的集合中。
Spring IOC 容器的 autowiring 属性自动依赖注入是一个很方便的特性,可以简化开发时的配置,但是凡是都有两面性,自动属性依赖注入也有不足,首先,Bean 的依赖关系在 配置文件中无法很清楚地看出来,对于维护造成一定困难。其次,由于自动依赖注入是 Spring 容器自动执行的,容器是不会智能判断的,如果配置不当,将会带来无法预料的后果,所以自动依赖注入特性在使用时还是综合考虑。


评论


亲,登录后才可以留言!