此博客為學(xué)習(xí)筆記,記錄下來怕自己后面學(xué)著學(xué)著忘記了。
簡書內(nèi)容同步更新,id同名,本文csdn鏈接
在上一篇文章中記錄了Spring Bean中的配置屬性+實(shí)例化+作用域,此文將Spring Bean的補(bǔ)充生命周期。
這是上篇鏈接:Spring5基礎(chǔ)(3)——Spring Bean(配置屬性+實(shí)例化+作用域)
Spring Bean生命周期
一個對象在生命周期中會有實(shí)例化,初始化,使用對象,銷毀等過程,Spring Bean也是對象,只是Spring提供一些接口,使得我們可以在Bean的生命周期中進(jìn)行一些操作。在Spring Bean中實(shí)例化是Bean對象開辟空間,初始化是對屬性的初始化。
Spring容器可管理作用域?yàn)?singleton的 Bean生命周期,而作用域?yàn)閜rototype的Bean則交給了客戶端來管理。
Bean的生命周期過程如下:
- ① 根據(jù)Bean的配置信息實(shí)例化
- ②根據(jù)Spring上下文對實(shí)例化的Bean進(jìn)行依賴注入,即對Bean的屬性初始化。
- ③若Bean實(shí)現(xiàn)了BeanNameAware接口,將調(diào)用它實(shí)現(xiàn)的setBeanName(String beanId)方法,beanid即xml配置文件中Bean的id。
- ④若Bean實(shí)現(xiàn)了BeanFactory接口,將調(diào)用它實(shí)現(xiàn)的setBeanFactory方法,參數(shù)為當(dāng)前Spring工廠實(shí)例的引用。
- ⑤若Bean實(shí)現(xiàn)了ApplicationContextAware接口,將調(diào)用它實(shí)現(xiàn)的setApplicationContext方法,參數(shù)為當(dāng)前Spring上下文實(shí)例。
- ⑥若Bean關(guān)聯(lián)了BeanPostProcessor接口,將調(diào)用它實(shí)現(xiàn)的postProcessBeforeInitialization(Object obj,String str)方法,對Bean進(jìn)行操作。在初始化結(jié)束時(即第八點(diǎn)之后)會調(diào)用postProcessBeforeInitialization(Object obj,String str)方法,此方法由于是初始化結(jié)束調(diào)用,因此可用于內(nèi)存或緩存技術(shù)
- ⑦若Bean實(shí)現(xiàn)了InitializingBean接口,將調(diào)用afterPropertiesSet方法。
- ⑧若Bean在xml配置文件中配置了init-method屬性,則將調(diào)用該屬性所填寫的初始化方法。
例如下面例子:設(shè)置配置文件中該Bean的init-method屬性為myInitMethod,Spring IoC容器初始化該Bean的時候就會調(diào)用該類中的myInitMethod()方法。
配置文件中:
<bean id="C5_2" class="com.lipiao.demo.C"
init-method="myInitMethod">
<property name="name" value="C_strName_setter"/>
</bean>
該類中:
package com.lipiao.demo;
public class C {
String name;
public void setName(String name) {
this.name = name;
}
//自定義的初始化方法
private void myInitMethod() {
//該Bean的初始化操作省略
}
}
以上步驟完成之后就到了使用Bean的階段了。
- ⑨Bean不需要使用時進(jìn)入銷毀階段(IoC容器關(guān)閉后會銷毀對象),若實(shí)現(xiàn)了DisPosable接口,則調(diào)用destroy()方法將Bean銷毀。
- ⑩若xml配置文件中使用destroy-method屬性指定了特定的Bean銷毀方法,則調(diào)用此屬性對應(yīng)的方法。
還是剛剛上面那個例子,添加部分代碼如下所示:
配置文件中:
<bean id="C5_2" class="com.lipiao.demo.C"
init-method="myInitMethod"
destroy-method="myDestroyMethod">
<property name="name" value="C_strName_setter"/>
</bean>
該類中:
package com.lipiao.demo;
public class C {
String name;
public void setName(String name) {
this.name = name;
}
//自定義的初始化方法
private void myInitMethod() {
//該Bean的初始化操作省略
}
//自定義的銷毀方法
private void myDestroyMethod() {
//該Bean的銷毀操作
}
}