Spring Bean的生命周期詳解


1. Spring Bean的生命周期的定義

Spring Bean 的生命周期指的是從一個普通的 Java 類變成 Bean 的過程.

2. Spring Bean的創建過程

2.1 總的創建過程

普通 Java 類 -> BeanDefinition -> Spring Bean
以注解情況說明,就是 Spring 會掃描指定包下面的 Java 類,然后將其轉化成 BeanDefinition 對象,然后 Spring 會根據 BeanDefinition 來創建 bean(主要一點就是 Spring 是根據 BeanDefinition 來創建 Bean)

2.2 BeanDefinition

BeanDefinition 包含了很多內容,舉幾個例子:factoryBeanName,initMethodName,destoryMethodName,lazyInit, scope,autowireMode,propertyValues...等等。 這些根據名稱都知道啥意思,解釋一下 autowireMode ,這個表示注入模型屬性,記錄使用怎樣的注入模型,注入模型常用的有根據名稱和根據類型、不注入三種注入模型。在我們寫注解類的時候為什么不使用 @Autowired 時,其屬性就注入不進來呢?那是因為注解類在變成 BeanDefinition 時,其注入類型是不注入,所以此時只有使用 @Autowired 注解進行標記的屬性,才會完成依賴注入。

2.3 Java 類 -> BeanDefinition

先來看一下 Spring 中 AbstractApplicationContext 類中的 refresh 方法,這個方法就可以總結創建過程。

關於 Spring Bean 最主要的三個方法:invokeBeanFactoryPostProcessors,registerBeanPostProcessor, finishBeanFactoryInitialization。
invokeBeanFactoryPostProcessors: 這個方法會執行 BeanFactoryPostProcessor 后置處理器和BeanDefinitionRegistryPostProcessor (子接口), 執行順序:postProcessorBeanDefinitionRegistry -> postProcessorBeanFactory, postProcessorBeanDefinitionRegistry 會掃描指定包下面帶有注解的 java 類,比如 @Component,@Controller,@Service等等;然后將根據這些類生成 BeanDefinition 對象,存儲到 Spring 的 Map 中,這個在上面說到 Spring 是根據 BeanDefinition 來創建 Bean。
registerBeanPostProcessor:這個方法注冊了所有的 BeanPostProcessor 后置處理器,在 Spring Bean 創建時,執行這些后置處理器的方法,這也是 Spring 框架提供的擴展點,可以幫助開發者參與到 Bean 的創建過程。

2.4 BeanDefinition -> Spring Bean

finishBeanFactoryInitialization:該方法完成 Spring Bean 的創建過程,直接上圖

2.4.1 InstantiationAwareBeanPostProcessor

該接口的主要作用在於目標對象的實例化過程中需要處理的事情,包括實例化對象的前后過程以及實例的屬性設置。在AbstractAutowireCapableBeanFactory#createBean()方法的beanInstance = this.resolveBeforeInstantiation(beanName, mbdToUse);里面執行了這個后置處理器。
postProcessBeforeInstantiation:在目標對象實例化之前調用,方法的返回值類型是Object。由於這個時候目標對象還未實例化,所以這個返回值可以用來代替該生成的目標對象的實例(正常是代理對象)。如果該方法的返回值代替了目標對象,后續只會調用postProcessAfterInitialization方法,其它方法不會調用;否則按照正常的流程走
postProcessAfterInstantiation:在目標對象實例化之后會調用該方法,這個時候對象只是實例化,並沒有設置屬性。如果該方法返回false,會忽略屬性值的設置;如果返回true,會按照正常流程設置屬性值。
postProcessPropertie:這個方法是對屬性值進行修改。5.1之前是用的postProcessPropertyValues,5.1之后使用的是postProcessProperties,但業務邏輯是一樣的。

2.4.2 SmartInstantiationAwareBeanPostProcessor

該接口繼承了InstantiationAwareBeanPostProcessor。
determineCandidateConstructors:該方法獲取Bean的構造器
getEarlyBeanReference: 這個較復雜,主要用於解決循環引用的問題,只有單例對象才會調用此方法

2.4.3 BeanPostProcessor


postProcessBeforeInitialization:該方法會在初始化之前進行執行
postProcessAfterInitialization:該方法的執行是在調用init方法之后執行,主要是判斷該bean是否需要被AOP代理增強,如果需要的話,則會在該步驟返回一個代理對象。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM