Spring 框架源码:BeanFactory 与 Bean 的生命周期
基于 Spring5.0.6 版本。
一 BeanFactory
类路径:org.springframework.beans.factory.BeanFactory
BeanFactory 是 Spring IOC 实现的基础,提供了 getBean 方法(),isSingleton(),isPrototype(name),isTypeMatch(),getType 和 String[] getAliases(String name)等核心方法。
String FACTORY_BEAN_PREFIX = "&";
接口中包含了一个成员变量,内容从变量命名上看,是 factorybean 的前缀。注释的英文描述:
翻译过来,这个前缀用于间接引用一个 FactoryBean 实例,并把它与用 FactoryBean”创建“的 beans 区分开来。例如:如果 bean 名为 myJndiObject 是一个 FactoryBean,get &myJndiObject 将会 return 工厂,而不是由工厂创建的实例。
查看被调用关系,可以查到在 DefaultListableBeanFactory,BeanFactoryUtils,AbstractAutoProxyCreator 这三个类中都有使用(不止这三个类)。
先看 BeanFactoryUtils 中的使用位置:
是判断一个输入字符串,是否是否是间接引用。
可见,方法是用语判断输入的 bean(名称)是否是间接引用。
二 Spring bean 生命周期
1、实例化 Instantiation
2、属性赋值 Populate
3、初始化 Initialization
4、销毁 Destruction
1、InstantiationAwareBeanPostProcessor 接口继承 BeanPostProcessor 接口,它内部提供了 3 个方法,再加上 BeanPostProcessor 接口内部的 2 个方法,所以实现这个接口需要实现 5 个方法。InstantiationAwareBeanPostProcessor 接口的主要作用在于目标对象的实例化过程中需要处理的事情,包括实例化对象的前后过程以及实例的属性设置。
2、postProcessBeforeInstantiation 方法是最先执行的方法,它在目标对象实例化之前调用,该方法的返回值类型是 Object,我们可以返回任何类型的值。由于这个时候目标对象还未实例化,所以这个返回值可以用来代替原本该生成的目标对象的实例(比如代理对象)。如果该方法的返回值代替原本该生成的目标对象,后续只有 postProcessAfterInitialization 方法会调用,其它方法不再调用;否则按照正常的流程走。
3、postProcessAfterInstantiation 方法在目标对象实例化之后调用,这个时候对象已经被实例化,但是该实例的属性还未被设置,都是 null。因为它的返回值是决定要不要调用 postProcessPropertyValues 方法的其中一个因素(因为还有一个因素是 mbd.getDependencyCheck());如果该方法返回 false,并且不需要 check,那么 postProcessPropertyValues 就会被忽略不执行;如果返回 true,postProcessPropertyValues 就会被执行。
4、postProcessPropertyValues 方法对属性值进行修改(这个时候属性值还未被设置,但是我们可以修改原本该设置进去的属性值)。如果 postProcessAfterInstantiation 方法返回 false,该方法可能不会被调用。可以在该方法内对属性值进行修改。
5、父接口 BeanPostProcessor 的 2 个方法 postProcessBeforeInitialization 和 postProcessAfterInitialization 都是在目标对象被实例化之后,并且属性也被设置之后调用的。
版权声明: 本文为 InfoQ 作者【程序员架构进阶】的原创文章。
原文链接:【http://xie.infoq.cn/article/f2ffaee938f013c625db65ad2】。文章转载请联系作者。
评论