下图是我搜索“Spring Bean生命周期”找到的图片,来自文章——Spring Bean的生命周期
文章插图
下面,我们从
AbstractAutowireCapableBeanFactory
的源码中来分析这张图的各个阶段到底是怎么执行的 。BeanFactory的基本源码解读在Spring BeanFactory接口分析&源码解读这篇文章中,如果读本篇文章稍显吃力,可以先去看看上面那篇 。我们所用到的BeanFactory,ApplicationContext基本都继承了Bean生命周期简单描述#我们先不看那些繁杂的生命周期方法回调,只看核心的部分,也就是图中四个大的黄色块AbstractAutowireCapableBeanFactory
, 它是一个具有自动装载能力的BeanFactory,它可以响应@Autowire
注解,所以,单独分析这个类不是没用的,而且很有必要 。
同时,由于Spring的BeanFactory层次结构中大量的使用了模板模式,所以我们可能在这个类的父子类中跳入跳出 。
- 根据BeanDefinition创建Bean,这个过程称为实例化
- 填充Bean的属性
- 这时 , Bean已经创建完毕并可以投入使用,这时需要调用Bean的初始化方法(如果用户指定了的话),这个过程称为初始化
- Bean被销毁
- 实例化
- 设置属性
- 初始化
- 销毁
虽然上面我们把大部分的繁杂的生命周期Hook给屏蔽了,总结出了四个核心的过程,但是这些Hook给了Spring框架带来了无尽的灵活性,所以也是非常重要的 。但它们太容易让人眼花了,所以在继续之前 , 我们有必要先介绍一下那些东西都是什么,是用来解决什么问题的 。BeanPostProcessor接口#BeanPostProcessor接口有如下方法:
public interface BeanPostProcessor { @Nullable default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {return bean; } @Nullable default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {return bean; }}
从方法名上看,xxxxBeforeInitialization
,xxxAfterInitialization
,意思是在初始化阶段前后做一些事,它的参数中,有实际创建出来的Bean和Bean的名字,该方法默认情况下返回原始的bean , 也可以返回该bean的某种代理,实际上AOP就是通过这个接口来实现bean代理的返回的 。所以,
BeanPostProcessor
实际关心的是Bean的初始化阶段 。InstantiationAwareBeanPostProcessor#首先,它继承ConfigurableBeanFactory
接口的addBeanPostProcessor
方法可以向BeanFactory中注册BeanPostProcessor
BeanPostProcessor
,所以它是一个BeanPostProcessor
。但是从名字来看,InstantiationAware
表示它更关心对于Bean的实例化阶段的感知,而不是初始化阶段,它发生在初始化阶段前面 。它的方法如下:
public interface InstantiationAwareBeanPostProcessor extends BeanPostProcessor { @Nullable default Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {return null; } default boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {return true; } @Nullable default PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName)throws BeansException {return null; }// 省略一个过时方法...}
首先,xxxBeforeInstantiation
、xxxAfterInstantiation
是很容易和之前的两个搞混的 , 不过以Instantiation
结尾代表着它们关心的是Bean实例化的前后,在实例化前,该方法同样允许返回一个代替该Bean的对象,不过这次由于Bean还没有实际创建出来,所以它的参数中没有Bean对象,而是该Bean的Class对象 。而在实例化后,它允许返回一个布尔值来指定是否该对该Bean的属性进行设置(true设置 , false跳过) 。Aware生命周期感知接口#Aware接口里啥也没有,有方法的是它的子接口
public interface Aware { }
Aware被一个想要感知到框架中的某种信息的Bean实现 , 比如一个Bean可能对创建它的Bean工厂感兴趣,那么它可以实现这个接口:public interface BeanFactoryAware extends Aware { void setBeanFactory(BeanFactory beanFactory) throws BeansException;}
Bean工厂会在该Bean的初始化阶段检测该Bean是否实现了这个接口,如果实现了就调用它的setBeanFactory
方法将工厂设置进去 。
推荐阅读
- 详解AQS中的condition源码原理
- 怎么去巴基斯坦去巴基斯坦时需要注意什么(从中国去巴基斯坦怎么去)
- 有到过伊拉克的人吗应该怎么去(从国内怎样到伊拉克)
- 从ObjectPool到CAS指令
- 蜘蛛的丝是从哪里吐出来的?
- .net 温故知新:【8】.NET 中的配置从xml转向json
- iqoo7电池多大_iqoo7电池多少毫安
- 【lwip】08-ARP协议一图笔记及源码实现
- <一>从指令角度了解函数堆栈调用过程
- 【lwip】07-链路层收发以太网数据帧源码分析