1. 程式人生 > >【Spring學習21】Bean生命週期回撥:初始化回撥和銷燬回撥

【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框架緊耦合。