bean的生命週期

摘抄自百度

Spring Bean的生命週期

先經過一個流程圖,對Spring Bean 的生命週期有一個總體的瞭解。函數

 
Bean生命週期圖解



 

概述

一個對象的生命週期有:建立(初始化-實例化),使用 和 銷燬。Spring中的Bean也遵循這一原則,可是Spring提供了一些對外接口,容許開發者在這三個過程當中作一些額外的操做。post

注意 實例化 和 初始化 的區別:
在Spring中,實例化,是爲Bean對象開闢內存空間(能夠理解爲構造方法的調用),初始化,則是對屬性的初始化,也能夠理解爲對屬性的注入(構造函數也有屬性初始化語句,但不屬於這部分)
屬性的注入,是經過setter方法/參數 注入。無論是經過註解仍是XML配置。spa

 


相關接口,方法說明

1) Bean自身的方法:init-method / destory-method , 經過在配置文件bean定義的相應屬性中,指定相應的執行方法。.net

2)Bean級別生命週期接口:BeanNameAware,BeanFactoryAware,IntializaingBean,DiposableBean 這些接口的方法。每一個Bean均可以選擇實現,能夠選擇各自的自定義操做。翻譯

3)容器級生命週期接口方法:BeanPostProcessor 和 InstantiationAwareBeanPostProcessor(繼承自BeanPostProcessor) 這兩個的接口的實現。咱們通常稱之爲後置處理器,這個在第二篇文章有講到。這些接口的實現註冊到bean的配置文件中,是每一個Bean實例化或者初始化時候都會調用。orm

4)工廠後處理器接口方法:這些方法也是容器級別的。可是它們是在上下文裝置配置文件以後調用。例如:BeanFactoryPostProcessor,CustomAutowireConfigure等。xml

 


Bean 具體生命更週期

初始化過程

1) BeanFactoryPostProcessor.postProcessBeanFactory
工廠後處理器(這名字其實只是一個翻譯,意義有時候並不必定正確),這個方法其實和Bean的生命週期沒多少關係,是 Spring IoC 容器(ApplicationContext)初始化的一部分,詳細能夠參考 IoC 容器初始化的內容。對象

具體是每一次刷新時(初始化)調用,它是對 BeanDefinition 進行後處理(BeanDefinition能夠參考:SpringIoC容器結構),做用是能夠修改配置文件的各個 bean 的配置。
實現:寫一個類實現 BeanFactoryPostProcessor 接口,重寫該方法,並在Spring配置文件中配置這個類的bean。

blog

2)InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation
全部bean對象實例化以前執行,具體就是:執行每一個bean類的構造函數以前。
實現:寫一個類實現 InstantiationAwareBeanPostProcessor 接口,重寫該方法,該方法返回一個Object,但實際上返回一個null便可。在Spring配置文件中配置一個該類的bean。

繼承

3)調用Bean的構造函數,實例化bean

4)InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation
bean類調用構造函數實例化以後,初始化以前,調用。
實現同第二步,重寫該方法。注意:這個返回值是boolean,默認爲false。要改成true,不然沒法注入屬性

5)InstantiationAwareBeanPostProcessor.postProcessPropertyValue
屬性注入以前調用該方法。
實現同第二步,注意返回類型是PropertyValues,默認返回null,這裏須要改成返回第一個參數propertyValues。

6)BeanNameAware.setBeanName
屬性注入後調用,該方法做用是讓bean的類知道本身所在的Bean的name或者id屬性
實現:bean類實現BeanNameAware接口,重寫該方法。

7)BeanFactoryAware.setBeanFactory
setBeanName以後調用,該方法做用是讓bean類知道本身所在的BeanFactory的屬性(傳入bean所在BeanFactory類型參數)
實現:bean類實現BeanFactoryAware接口,重寫該方法。

8)BeanPostProcessor.postProcessBeforeInitialization
BeanPostProcessor做用是對bean實例化,初始化作些預處理操做。(具體看上一篇文章 講 BeanPostProcessor)
實現:寫一個類,實現BeanPostProcessor,重寫該方法,注意返回類型爲Object,默認返回的是null,但須要返回參數中的bean。而後在Spring配置文件中加入這個bean

9)bean裏面 @PostConstruct 註解標註的方法

10)InitializingBean.afterPropertiesSet
在Bean加載完成後,執行方法。
實現:bean類實現 InitializingBean 接口。重寫該方法,執行初始化工做。但這種方法和Spring耦合,並不推薦(這一點和DisposableBean同樣)

11)XML文件中 bean配置的 init-method
xml文件中,bean標籤的 init-method屬性,能夠指定方法。

12)BeanPostProcessor.postProcessAfterInitialization
在bean初始化以後,執行的方法。
實現方式和第8步同樣。

銷燬過程

1)bean裏面 @PreDestory 註解標註的方法

2)DisposableBean.destory
bean銷燬前執行的方法。(並不推薦)
實現:bean類實現 DisposableBean 接口,重寫該方法便可。

3)XML文件中 bean配置的destory-methodxml文件中,bean標籤的 destory-method屬性。能夠指定方法。

相關文章
相關標籤/搜索