1. 程式人生 > >Spring Bean生命週期回撥——初始化回撥(init-method)與銷燬回撥(destroy-method)

Spring Bean生命週期回撥——初始化回撥(init-method)與銷燬回撥(destroy-method)

實現Bean初始化回撥和銷燬回撥各有三種方法,一是實現介面方法,二是在XML配置,三是使用註解

初始化回撥(init-method)

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、使用註解
3.1 JSR-250註解的方式(需要匯入jsr250-api的jar包)
public class ExampleBean {
@PostConstruct
public void customer_init() {
System.out.println("@PostConstruct註解指定的初始化方法:customer_init。" );
}

}

3.2 使用java Config,要在@Bean註解中使用initMehtod屬性

@Bean(initMethod = "customer_init")
public User user() {
     ...
}

銷燬回撥(destroy-method)

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、使用註解
3.1 JSR-250註解的方式(需要匯入jsr250-api的jar包)

public class User {
@PreDestory
    public void customer_destory() {
        System.out.println("呼叫destory-method指定的初始化方法:customer_destory。" );
    }
}

3.2 使用java Config,要在@Bean註解中使用initMehtod屬性

@Bean( destroyMethod = "customer_destory")
public User user() {
     ...
}

全域性設定

在頂級元素中定義初使化和銷燬函式(必須統一函式名)

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