【Spring學習21】Bean生命週期回撥:初始化回撥和銷燬回撥
實現Bean初始化回撥和銷燬回撥各有三種方法,一是實現介面方法,二是在XML配置,三是使用註解
初始化回撥
1、使用介面
org.springframework.beans.factory.InitializingBean介面類的作用是:在容器設定bean必須的屬性之後執行初始化工作。
InitializingBean介面中只有一個方法:void afterPropertiesSet() throws Exception;
實現:
<bean id="CristianoRonaldo" class="twm.spring.LifecycleTest.User" />
public class User implements InitializingBean {
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("呼叫介面:InitializingBean,方法:afterPropertiesSet,無引數。");
}
}
2、使用XML
<bean id="CristianoRonaldo" class="twm.spring.LifecycleTest.User" init-method="customer_init" />
public class User {
public void customer_init() {
System.out.println("呼叫init-method指定的初始化方法:customer_init。" );
}
}
3、使用註解
public class ExampleBean {
@PostConstruct
public void customer_init() {
System.out.println("@PostConstruct註解指定的初始化方法:customer_init。" );
}
}
注意:如果使用java Config,要在@Bean註解中使用initMehtod屬性。
銷燬回撥
1、使用介面
實現org.springframework.beans.factory.DisposableBean介面,作用是Spring銷燬bean時呼叫該方法。
DisposableBean介面只有一個方法:void destroy() throws Exception;
實現:
<bean id="CristianoRonaldo" class="twm.spring.LifecycleTest.User" />
public class User implements DisposableBean {
@Override
public void destroy() throws Exception {
System.out.println("呼叫介面:DiposibleBean,方法:destroy,無引數。");
}
}
2、使用XML
<bean id="CristianoRonaldo" class="twm.spring.LifecycleTest.User" destroy-method="customer_destory"/>
public class User {
public void customer_destory() {
System.out.println("呼叫destory-method指定的初始化方法:customer_destory。" );
}
}
3、使用註解
public class User {
@PreDestory
public void customer_destory() {
System.out.println("呼叫destory-method指定的初始化方法:customer_destory。" );
}
}
全域性設定
在頂級元素中定義初使化和銷燬函式(必須統一函式名)
<beans default-init-method="customer_init" default-destroy-method="customer_destory">
<bean id="CristianoRonaldo" class="twm.spring.LifecycleTest.User" />
</beans>
總結
1、在一個bean中,配置多種生命週期回撥機制,會按照下列次序呼叫:
帶@PostConstruct註解的方法
InitializingBean回撥介面中的afterPropertiesSet()方法
自定義的init()方法
2、銷燬回撥也使用相同的次序
帶@PreDestroy註解的方法
DisposableBean回撥介面中的destroy()方法
自定義的destroy()方法
3、不管是通過實現 InitializingBean/DisposableBean 介面,還是通過 <bean>
元素的init-method/destroy-method 屬性進行配置,都只能為 Bean 指定一個初始化 / 銷燬的方法。但是使用 @PostConstruct 和 @PreDestroy 註釋卻可以指定多個初始化 / 銷燬方法,那些被標註 @PostConstruct 或 @PreDestroy 註釋的方法都會在初始化 / 銷燬時被執行。
4、不建議使用介面和註解實現方式,因為這會讓pojo類與Spring框架緊耦合。