關于在spring 容器初始化 bean 和銷毀前所做的操作定義方式有三種:
第一種:通過@PostConstruct 和 @PreDestroy 方法 實作初始化和銷毀bean之前進行的操作
第二種是:通過 在xml中定義init-method 和 destory-method方法
第三種是: 通過bean實作InitializingBean和 DisposableBean接口
這些代碼執行的位置如下圖所示,以@PostConstruct 和 @PreDestroy為例
第一種方式:直接在代碼中定義
從Java EE 5規範開始,Servlet中增加了兩個影響Servlet生命周期的注解(Annotion);@PostConstruct和@PreDestroy。這兩個注解被用來修飾一個非靜态的void()方法。
被@PostConstruct修飾的方法會在伺服器加載Servle的時候運作,并且隻會被伺服器執行一次。PostConstruct在構造函數之後執行,init()方法之前執行。PreDestroy()方法在destroy()方法執行執行之後執行。
- package com.myapp.core.annotation.init;
- import javax.annotation.PostConstruct;
- import javax.annotation.PreDestroy;
- public class PersonService {
- private String message;
- public String getMessage() {
- return message;
- }
- public void setMessage(String message) {
- this.message = message;
- }
- @PostConstruct
- public void init(){
- System.out.println("I'm init method using @PostConstrut...."+message);
- }
- @PreDestroy
- public void dostory(){
- System.out.println("I'm destory method using @PreDestroy....."+message);
- }
- }
第二種方式:在xml中配置 init-method和 destory-method方法
隻是定義spring 容器在初始化bean 和容器銷毀之前的所做的操作
基于xml的配置隻是一種方式:
- <bean id="personService" class="com.myapp.core.beanscope.PersonService" scope="singleton" init-method="init" destroy-method="cleanUp">
- </bean>
第三種:實作InitializingBean和 DisposableBean接口
在Spring中,InitializingBean和DisposableBean是兩個标記接口,為Spring執行時bean的初始化和銷毀某些行為時的有用方法。
對于Bean實作 InitializingBean,它将運作 afterPropertiesSet()在所有的 bean 屬性被設定之後。
對于 Bean 實作了DisposableBean,它将運作 destroy()在 Spring 容器釋放該 bean 之後。
但不建議使用InitializingBean和DisposableBean的接口,因為它将你的代碼緊耦合到 Spring 代碼中。 一個更好的做法應該是在bean的配置檔案屬性指定 init-method和destroy-method。