天天看點

Spring Bean的生命周期

隻有singleton作用域的單例bean,Spring才會自動接管其生命周期,其他的如prototype就不會。源碼

執行個體化bean

當向容器請求依賴時,對于BeanFactory,調用createBean進行執行個體化。對于ApplicationContext容器,通過BeanDefinition對象中的資訊執行個體化bean。

屬性指派(依賴注入)

執行個體化後封裝在BeanWrapper對象中,Spring根據BeanDefinition(接口)中的資訊和提供的設定屬性的接口完成依賴注入。

初始化階段

檢查Aware相關接口并設定相關依賴

接着,Spring會檢測該對象是否實作了xxxAware接口,并将相關的xxxAware執行個體注入給Bean:

BeanPostProcesser前置處理

調用postProcessBeforeInitialization方法

是否實作InitializingBean接口

調用afterPropertySet方法

是否配置自定義的ini-method

如果Bean在Spring配置檔案中配置了 init-method 屬性,則會自動調用其配置的初始化方法。

BeanPostProcesser後置處理

調用postProcessAfterInitialization方法

注冊Destruction相關回調接口

如果這個Bean已經實作了BeanNameAware接口,會調用它實作的setBeanName(String beanId)方法,此處傳遞的就是Spring配置檔案中Bean的id值;

如果這個Bean已經實作了BeanFactoryAware接口,會調用它實作的setBeanFactory()方法,傳遞的是Spring工廠自身。

如果這個Bean已經實作了ApplicationContextAware接口,會調用setApplicationContext(ApplicationContext)方法,傳入Spring上下文;

使用階段

銷毀階段

是否實作DisposableBean接口

若實作了DisposableBean接口就調用其destroy方法

是否配置自定義destory-method

xml檔案配置了bean元素的destory-method屬性,調用其指定的方法。

Singleton:單例模式,在整個spring IOC容器中,使用singleton定義的bean将隻有一個執行個體。且容器會自動接管其生命周期。

Prototype:多例(原型)模式,每次通過容器中的getBean方法擷取prototype定義的beans時,都會産生一個新的bean的執行個體。

Request:對于每次Http請求,使用request定義的bean都會産生一個新的執行個體,隻有在web應用時候,該作用域才會有效。

Session:對于每次Http Session,使用session定義的Bean都将産生一個新的執行個體。

Global session:全局的web域,類似于servlet中的application。全每個全局的HTTP Session,使用session定義的Bean都将産生一個新執行個體。

繼續閱讀