Spring 中 bean 的生命週期
bean 生命週期
bean 的生命週期大致流程如下,後面會爲大家解釋每個流程具體的作用
- instantiate bean 對象實例化
- populate properties 封裝屬性
- 如果Bean實現 BeanNameAware 執行 setBeanName
- 如果 Bean 實現 BeanFactoryAware 執行 setBeanFactory,獲取 Spring 容器
- 如果存在類實現 BeanPostProcessor(後處理Bean),執行 postProcessBeforeInitialization
- 如果 Bean 實現 InitializingBean 執行 afterPropertiesSet
- 調用
<bean init-method="init">
指定初始化方法 init - 如果存在類實現 BeanPostProcessor(處理Bean),執行 postProcessAfterInitialization
- 如果 Bean 實現 DisposableBean 執行 destroy
- 調用
<bean destroy-method="customerDestroy">
指定銷燬方法 customerDestroy
對象實例化
bean 的生命週期從對象的實例化開始,當運行到下面的代碼時,就會實例化beans5.xml
中bean
標籤所定義的對象,並執行其構造方法
ApplicationContext context = new ClassPathXmlApplicationContext("beans5.xml");
封裝屬性
接下來,Spring 會根據bean
標籤下的property
標籤來爲對象賦值,即依賴注入(封裝屬性),這時實際執行的是實現類中對應屬性的set
方法,也就是說,想要通過這個方式爲對象封裝屬性,實現類中必須含有對應屬性的set
方法
private String name;
private String password;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
System.out.println("set name");
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
System.out.println("set password");
}
<bean id="user" class="com.lmh.model.User" init-method="myInit" destroy-method="myDestroy">
<property name="name" value="lmh"></property>
<property name="password" value="123"></property>
</bean>
BeanNameAware
如果實現類中實現了BeanNameAware
接口,那麼接下來對象就會執行重寫的setBeanName
方法
@Override
public void setBeanName(String s) {
// s:bean.xml 中的 bean id
System.out.println("set Bean name: " + s);
}
通過輸出我們知道,setBeanName
函數的參數s
爲bean
標籤中的id
屬性的值
BeanFactoryAware
如果實現類中實現了BeanFactoryAware
接口,接下來對象會執行重寫的setBeanFactory
方法
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
// 工廠生產對象後放進容器中去
System.out.println("Bean Factory: " + beanFactory);
}
此時是 Bean 工廠生產的對象被放進 Spring 容器中的過程
BeanPostProcessor
BeanPostProcessor
是 Spring IOC 容器提供的一種處理器接口,可以理解成一種對所有beans.xml
中對象均有效的處理器
使用時我們需要自定義處理器類,實現BeanPostProcessor
接口,重寫其postProcessBeforeInitialization
和postProcessAfterInitialization
方法
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
public class MyBeanProcessor implements BeanPostProcessor {
// 對所有對象有效
@Override
public Object postProcessBeforeInitialization(Object o, String s) throws BeansException {
// 可用於多個對象的共同事情
System.out.println("Before: " + s + " : " + o);
return o;
}
@Override
public Object postProcessAfterInitialization(Object o, String s) throws BeansException {
System.out.println("After: " + s + " : " + o);
return o;
}
}
其中o
爲當前執行處理器的對象,s
爲 bean 的id
屬性值,這裏postProcessBeforeInitialization
方法在 bean 的生命週期中會在上一步後執行,而postProcessAfterInitialization
圖中 Bean Is Ready To Use 之前執行
InitializingBean
如果實現類中實現了InitializingBean
接口,對象接下來會調用重寫的afterPropertiesSet
方法
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("6.Pro is seted...");
}
自定義 Init 方法
隨後,如果我們在實現類中自定義了 Init 方法,再bean
標籤中設置了init-method="init"
屬性後,自定義的 Init 方法會在這時執行
public void myInit() {
System.out.println("7.My Init");
}
<bean id="user" class="com.lmh.model.User" init-method="myInit">
</bean>
DisposableBean
以上週期執行完畢後,bean 就進入了可以被使用的狀態,當 bean 使用結束後,需要銷燬對象時,如果實現類中實現了DisposableBean
接口,會執行從寫的destroy
方法
@Override
public void destroy() throws Exception {
System.out.println("9.Bean is Destroy");
}
自定義 Destroy 方法
如果自定義了 Destroy 方法,會在這是執行,方式和自定義 Init 方法一致,實現類中定義 Destroy 方法,並在bean
標籤中設置destroy-method="destroy"
屬性
public void myDestroy() {
System.out.println("my Destroy");
}
<bean id="user" class="com.lmh.model.User" destroy-method="myDestroy">
</bean>