写点什么

Spring 框架源码:BeanFactory 与 Bean 的生命周期

发布于: 2021 年 02 月 14 日
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 的前缀。注释的英文描述:

/** * Used to dereference a {@link FactoryBean} instance and distinguish it from * beans <i>created</i> by the FactoryBean. For example, if the bean named * {@code myJndiObject} is a FactoryBean, getting {@code &myJndiObject} * will return the factory, not the instance returned by the factory. */
复制代码


翻译过来,这个前缀用于间接引用一个 FactoryBean 实例,并把它与用 FactoryBean”创建“的 beans 区分开来。例如:如果 bean 名为 myJndiObject 是一个 FactoryBean,get &myJndiObject 将会 return 工厂,而不是由工厂创建的实例。


查看被调用关系,可以查到在 DefaultListableBeanFactory,BeanFactoryUtils,AbstractAutoProxyCreator 这三个类中都有使用(不止这三个类)。


先看 BeanFactoryUtils 中的使用位置:

public static boolean isFactoryDereference(@Nullable String name) {		    return (name != null && name.startsWith(BeanFactory.FACTORY_BEAN_PREFIX));	}
复制代码


是判断一个输入字符串,是否是否是间接引用。

可见,方法是用语判断输入的 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 都是在目标对象被实例化之后,并且属性也被设置之后调用的。


发布于: 2021 年 02 月 14 日阅读数: 25
用户头像

磨炼中成长,痛苦中前行 2017.10.22 加入

微信公众号【程序员架构进阶】。多年项目实践,架构设计经验。曲折中向前,分享经验和教训

评论

发布
暂无评论
Spring框架源码:BeanFactory与Bean的生命周期