從BeanFactory源碼看Bean的生命周期

下圖是我搜索“Spring Bean生命周期”找到的圖片,來自文章——Spring Bean的生命周期

從BeanFactory源碼看Bean的生命周期

文章插圖
下面,我們從AbstractAutowireCapableBeanFactory的源碼中來分析這張圖的各個階段到底是怎么執行的 。BeanFactory的基本源碼解讀在Spring BeanFactory接口分析&源碼解讀這篇文章中,如果讀本篇文章稍顯吃力,可以先去看看上面那篇 。
我們所用到的BeanFactory,ApplicationContext基本都繼承了AbstractAutowireCapableBeanFactory , 它是一個具有自動裝載能力的BeanFactory,它可以響應@Autowire注解,所以,單獨分析這個類不是沒用的,而且很有必要 。
同時,由于Spring的BeanFactory層次結構中大量的使用了模板模式,所以我們可能在這個類的父子類中跳入跳出 。
Bean生命周期簡單描述#我們先不看那些繁雜的生命周期方法回調,只看核心的部分,也就是圖中四個大的黃色塊
  1. 根據BeanDefinition創建Bean,這個過程稱為實例化
  2. 填充Bean的屬性
  3. 這時 , Bean已經創建完畢并可以投入使用,這時需要調用Bean的初始化方法(如果用戶指定了的話),這個過程稱為初始化
  4. Bean被銷毀
所以,可以將Bean的創建歸納為:
  1. 實例化
  2. 設置屬性
  3. 初始化
  4. 銷毀
雖然上面我們把大部分的繁雜的生命周期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的初始化階段 。
ConfigurableBeanFactory接口的addBeanPostProcessor方法可以向BeanFactory中注冊BeanPostProcessor
InstantiationAwareBeanPostProcessor#首先,它繼承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方法將工廠設置進去 。

推薦閱讀