@PostConstruct 和 @PreDestroy
spring 容器中的 Bean 是有生命週期的,Spring 允許在 Bean 在初始化完成後以及 Bean 銷燬前執行特定的操作,您既可以通過實現 InitializingBean/DisposableBean 介面來定製初始化之後 / 銷燬之前的操作方法,也可以通過 <bean> 元素的 init-method/destroy-method 屬性指定初始化之後 / 銷燬之前呼叫的操作方法。關於 Spring 的生命週期,筆者在《精通 Spring 2.x—企業應用開發精解》第 3 章進行了詳細的描述,有興趣的讀者可以查閱。
JSR-250 為初始化之後/銷燬之前方法的指定定義了兩個註釋類,分別是 @PostConstruct 和 @PreDestroy,這兩個註釋只能應用於方法上。標註了 @PostConstruct 註釋的方法將在類例項化後呼叫,而標註了 @PreDestroy 的方法將在類銷燬之前呼叫。
package com.baobaotao;import javax.annotation.Resource;import javax.annotation.PostConstruct;import javax.annotation.PreDestroy;public class Boss { @Resource private Car car; @Resource(name = "office") private Office office; @PostConstruct public void postConstruct1(){ System.out.println("postConstruct1"); } @PreDestroy public void preDestroy1(){ System.out.println("preDestroy1"); } …}
您只需要在方法前標註 @PostConstruct
或 @PreDestroy
,這些方法就會在 Bean 初始化後或銷燬之前被 Spring 容器執行了。
我們知道,不管是通過實現 InitializingBean
/DisposableBean
介面,還是通過 <bean> 元素的init-method/destroy-method
屬性進行配置,都只能為 Bean 指定一個初始化 / 銷燬的方法。但是使用@PostConstruct
和@PreDestroy
註釋卻可以指定多個初始化 / 銷燬方法,那些被標註@PostConstruct
或 @PreDestroy
註釋的方法都會在初始化
/ 銷燬時被執行。
通過以下的測試程式碼,您將可以看到 Bean 的初始化 / 銷燬方法是如何被執行的:
package com.baobaotao; import org.springframework.context.support.ClassPathXmlApplicationContext; public class AnnoIoCTest { public static void main(String[] args) { String[] locations = {"beans.xml"}; ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(locations); Boss boss = (Boss) ctx.getBean("boss"); System.out.println(boss); ctx.destroy();// 關閉 Spring 容器,以觸發 Bean 銷燬方法的執行 } } |
這時,您將看到標註了 @PostConstruct
的 postConstruct1()
方法將在 Spring 容器啟動時,建立Boss
Bean 的時候被觸發執行,而標註了@PreDestroy
註釋的preDestroy1()
方法將在 Spring 容器關閉前銷燬Boss
Bean 的時候被觸發執行。
相關文章
- @PostConstruct與@PreDestroy講解及例項Struct
- 【spring原始碼學習】Spring @PostConstruct和@PreDestroy例項Spring原始碼Struct
- 【String註解驅動開發】你瞭解@PostConstruct註解和@PreDestroy註解嗎?Struct
- 通過Spring @PostConstruct 和 @PreDestroy 方法 實現初始化和銷燬bean之前進行的操作SpringStructBean
- Spring原始碼學習之: 通過Spring @PostConstruct 和 @PreDestroy 方法 實現初始化和銷燬bean之前進行的操作Spring原始碼StructBean
- @PostConstructStruct
- BeanPostProcessor 介面和@PostConstruct 在使用姿勢上差異BeanStruct
- 每日註解學習(九)@PostConstruct和@PreConstruct註解Struct
- Java面試題:@PostConstruct、init-method和afterPropertiesSet執行順序?Java面試題Struct
- Spring的Bean生命週期中@PostConstruct註解SpringBeanStruct
- Spring @PostConstruct自動執行某初始化方法SpringStruct
- 解決Eclipse啟動報缺少javax/annotation/PostConstruct的錯誤EclipseJavaStruct
- ../和./和/的區別
- 路徑中./和../和/
- !=和<>
- #和&
- linux中/bin和/sbin和/usr/bin和/usr/sbinLinux
- redis的安裝和啟動和檢測和停止Redis
- 深度解析 Delegate 和 Notification 和 KVO
- ♻️同步和非同步;並行和併發;阻塞和非阻塞非同步並行
- xftp和xshell,xftp和xshell的下載和安裝FTP
- 找工作學習筆記1------=和==、&和&&、|和||的區別筆記
- workman 和swoole 區別 和異同
- @NotEmpty和@NotBlank和@NotNull小結Null
- 檔案路徑問題( ./ 和 ../ 和 @/ )
- csv和excel讀取和下載Excel
- Cookie 和 Session 關係和區別CookieSession
- 堆和棧的概念和區別
- js中的typeof和instanceof和===JS
- hbase和zookeeper的安裝和部署
- JSF和Struts、Tiles Portlets和TapestryJS
- oracle中關於in和exists,not in 和 not existsOracle
- js == 和 ===JS
- 字首和
- XML基本操作-建立(DOM和LOINQ)和LINQ查詢和儲存XML
- 函式fgets和fputs、fread和fwrite、fscanf和fprintf用法小結函式
- DOORS和Reqtify — 需求管理和需求追溯工具QT
- Golang 陣列和切片 Slice 和 Map 使用Golang陣列