Spring 容器中 Bean 的生命周期
1. init-method 和 destory-method 方法
Spring 初始化 bean 或銷毀 bean 時,有時需要作一些處理工作,因此 spring 可以在創建和拆卸 bean 的時候調用 bean 的兩個生命周期方法。
如:
bean id="xxx" class="xxx" init-method="init" destory-method="destory" />
-
當 bean 被載入到容器的時候調用 init,當 bean 從容器中刪除的時候調用 destory(scope=singleton有效)。init 和 destory 的方法名可以自己命名
-
web 容器中會自動調用,但是 main 函數或測試用例需要手動調用
2. Spring 容器中 Bean 的生命周期(了解)
- instantiate bean 對象實例化
- populate properties 封裝屬性
- 如果 Bean 實現 BeanNameAware 執行 setBeanName
- 如果 Bean 實現 BeanFacotryAware 或者 ApplicationContextAware 設置工廠 setBeanFactory 或者上下文對象 setApplicationContext
- 如果存在類實現 BeanPostProcessor(后處理Bean),執行 postProcessBeforeInitialization
- 如果 Bean 實現 InitializingBean執行 afterPropertiesSet
- 調用
<bean init-method="init">
指定初始化方法 init ,如果存在類實現 BeanPostProcessor(處理 Bean),執行 postProcessAfterInitialization - 執行業務處理
- 如果 Bean 實現 DisposableBean ,執行 destroy
- 調用
bean destroy-method="customerDestroy">
指定銷毀方法 customerDestroy
其中最重要的是:第五步和第七步。
在 ide 中實現上述過程,打印如下:
3. beanpostprocessor 的作用
beanpostprocessor 類可以在生成類的過程當中,對類產生代理,並可以對類中的方法進行增強。
如下面代碼就是一個 beanpostprocessor 類,我們對 postProcessAfterInitialization 初始化后方法進行增強。增強 bean 中的 save 方法。
public class MyBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
// System.out.println("第五步:初始化前的方法...");
return bean;
}
@Override
public Object postProcessAfterInitialization(final Object bean, String beanName) throws BeansException {
// System.out.println("第八步:初始化后方法...");
//使用代理,構造匿名函數
if ("userDao".equals(beanName)) {
Object proxy = Proxy.newProxyInstance(bean.getClass().getClassLoader(), bean.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if ("save".equals(method.getName())) {
System.out.println("權限校驗==========");
// 傳入屬性
return method.invoke(bean, args);
}
return method.invoke(bean, args);
}
});
return proxy;
} else {
return bean;
}
}
}
輸出如下: