一文讀懂Spring框架中Bean的生命周期


我們先來聊聊bean的生命周期:

bean的生命周期圖:

AbstractAutowireCapableBeanFactory的docreateBean()方法(簡單描述):

 1.可以根據源碼的時候得出在docreateBean方法里面是bean生命周期的核心邏輯:

//只放了核心邏輯   
protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args) throws BeanCreationException { // bean初始化第一步:默認調用無參構造實例化Bean // 構造參數依賴注入,就是發生在這一步 if (instanceWrapper == null) { //再這個地方完成了對象的創建,推斷創建構造方法 進入 instanceWrapper = createBeanInstance(beanName, mbd, args); } // Initialize the bean instance. Object exposedObject = bean; try { // bean初始化第二步:填充屬性(DI依賴注入發生在此步驟) // 調用反射和內省去進行屬性設置 // 屬性值需要進行類型轉換,判斷屬性注入是否需要 populateBean(beanName, mbd, instanceWrapper); // bean初始化第三步:調用初始化方法,完成bean的初始化操作(AOP發生在此步驟) exposedObject = initializeBean(beanName, exposedObject, mbd); } }

我們根據Bean生命周期圖進行Bean生命周期的內部講解:

詳細步驟介紹:

實例化:

1:Bean的實例化調用createBeanInstance(beanName, mbd, args)方法默認調用無參構造實例化Bean

依賴注入:

2.Bean的依賴注入  ->調用->populateBean(beanName, mbd, instanceWrapper)方法完成 Bean 中所有屬性值的配置注入,最終核心還是根據PropertyHandler的setValue()方法進行setter方法的調用(注入);

初始化:

3.檢查有無Aware的相關接口設置相關依賴:

3.1.如果Bean 實現了 BeanNameAware 接口,則 Spring 調用 Bean 的 setBeanName() 方法傳入當前 Bean 的 id 值。

3.2.如果 Bean 實現了 BeanFactoryAware 接口,則 Spring 調用 setBeanFactory() 方法傳入當前工廠實例的引用。

3.3.如果 Bean 實現了 ApplicationContextAware 接口,則 Spring 調用 setApplicationContext() 方法傳入當前 ApplicationContext 實例的引用。

.

4.如果 BeanPostProcessor 和 Bean 關聯,spring將調用它們的postProcessBeforeInitialization(Object bean, String beanName)(預初始化)方法它作用是在Bean實例創建成功后進行增強處理(如對Bean進行修改,增加某個功能等)。

5.是否實現InitializingBean接口,如果 Bean 實現了 InitializingBean 接口,則 Spring 將調用 afterPropertiesSet() 方法作用是在bean正式構造完成前增加我們自己自定義的邏輯(只能增加一些額外的邏輯)。

6.是否配置自定義的init方法(比如說配置文件中通過 init-method 屬性指定了初始化方法),配置則執行初始化方法。

7.如果 BeanPostProcessor 和 Bean 關聯,spring將調用它們的postProcessBeforeInitialization(Object bean, String beanName),(預初始化)作用和步驟4一樣,只是時機不一樣,步驟4是初始化前,這是初始化后。

銷毀步驟:

8.如果 Bean 實現了 DisposableBean 接口,則 Spring 會調用 destory() 方法將 Spring 中的 Bean 銷毀

9.如果在配置文件中通過 destory-method 屬性指定了 Bean 的銷毀方法,則 Spring 將調用該方法對 Bean 進行銷毀

總結:

Bean的生命周期基本上分為4大步:

1.Bean的實例化 ->createBeanInstance()

2.Bean的屬性注入(依賴注入)  ->populateBean(beanName, mbd, instanceWrapper);

3.Bean的初始化: ->initializeBean(beanName, exposedObject, mbd);

 4:Bean的銷毀:是容器關閉時調用的,在ConfigurableApplicationContext類的close()中


免責聲明!

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



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