java Spring PostConstruct PreDestroy bean lifecycle

使用@PostConstruct、@PreDestroy控制Spring Bean的生命週期

曾克維 2016/12/07 19:46:34
13564


主題

使用@PostConstruct@PreDestroy控制Spring Bean的生命週期

文章簡介

介紹@PostConstruct@PreDestroy的作用,及使用案例

作者

曾克維

版本/產出日期

V1.0/2016.12.04


1. 前言

本文件用來提供Java開發人員在Spring環境下如何使用@PostConstruct、@PreDestroy來控制一個bean的生命週期

開發框架使用springframework 4.3.4。

本文件適用於Spring 2.5以上版本開發。






2. 目的

介紹@PostConstruct、@PreDestroy作用。

使用案例分享。






3. 開始前準備

本架構建立於以下版本的環境:

JDK8

Intelli J IDEA 15

Tomcat 7

Gradle 2.9

Spring 4.3.4






4. @PostConstruct@PreDestroy介紹

在Spring框架環境中,可以實作InitializingBean、DisposableBean或在配置檔定義特定的init-method、destroy-method來初始化或解除一個Bean,但也能使用@PostConstruct@PreDestroy這兩個註釋來達到相同的目的.


這兩個註釋並非Spring所定義的,而是被定義的J2EE的套件裡,在一個要被建立成Bean的類別中,新增一個方法並加上@PostConstruct註釋,此方法將會在這個Bean所有必要的屬性設定完成後才執行初始化的工作.


若是在方法上加上@PreDestroy註釋,此方法會在這個Bean所在的容器被銷毀時執行,以下提供範例:


新增一個TestBean類別,並加上@PostConstruct註釋的方法,及@PreDestroy註釋的方法:


將TestBean類別宣告為一個Bean:


部署至Tomcat,並執行,init()會在屬性message設置完畢後才被呼叫執行:


解除在Tomcat的部署,cleanUp()會在容器關閉時被呼叫執行:


5. 案例實作

實作一個SocketServerManager繼承自Tread的類別


將此類別設為bean:

將專案部署至Tomcat上,並啟動Tomcat server:


接著將專案重新部署至Tomcat上,會跳出Address already in use的訊息,導致SocketServerManager這個bean無法建立


使用@PreDestroy解決,並加上一個Flag來控制Socket的監聽:


關閉Tomcat將修改好的專案部署上去後啟動Tomcat,再重新部署專案一次:

……


解構SocketServerManage bean時,會執行有@PreDestroy註釋的方法,關閉SocketServer後,使之後能順利重新建立bean


6. 參考來源

Lifecycle callbacks-http://docs.spring.io/spring/docs/current/spring-framework-reference/html/beans.html - beans-factory-lifecycle-initializingbean

曾克維