使用@PostConstruct、@PreDestroy控制Spring Bean的生命週期
主題: |
使用@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