在以前的文章中,咱們介紹瞭如何使用@Bean註解指定初始化和銷燬的方法,小夥伴們能夠參見《【Spring註解驅動開發】如何使用@Bean註解指定初始化和銷燬的方法?看這一篇就夠了!!》,也介紹了使用InitializingBean和DisposableBean來處理bean的初始化和銷燬,小夥伴們能夠參見《【Spring註解驅動開發】Spring中的InitializingBean和DisposableBean,你真的瞭解嗎?》。除此以外,在JDK中也提供了兩個註解可以在bean加載到Spring容器以後執行和在bean銷燬以前執行,今天,咱們就一塊兒來看看這兩個註解的用法。java
項目工程源碼已經提交到GitHub:https://github.com/sunshinelyz/spring-annotationgit
@PostConstruct註解好多人覺得是Spring提供的。實際上是Java本身的註解。咱們來看下@PostConstruct註解的源碼,以下所示。github
package javax.annotation; import java.lang.annotation.*; import static java.lang.annotation.ElementType.*; import static java.lang.annotation.RetentionPolicy.*; @Documented @Retention (RUNTIME) @Target(METHOD) public @interface PostConstruct { }
從源碼能夠看出,@PostConstruct註解是Java中的註解,並非Spring提供的註解。spring
@PostConstruct註解被用來修飾一個非靜態的void()方法。被@PostConstruct修飾的方法會在服務器加載Servlet的時候運行,而且只會被服務器執行一次。PostConstruct在構造函數以後執行,init()方法以前執行。服務器
一般咱們會是在Spring框架中使用到@PostConstruct註解,該註解的方法在整個Bean初始化中的執行順序:微信
Constructor(構造方法) -> @Autowired(依賴注入) -> @PostConstruct(註釋的方法)。框架
@PreDestroy註解一樣是Java提供的,看下源碼,以下所示。函數
package javax.annotation; import java.lang.annotation.*; import static java.lang.annotation.ElementType.*; import static java.lang.annotation.RetentionPolicy.*; @Documented @Retention (RUNTIME) @Target(METHOD) public @interface PreDestroy { }
被@PreDestroy修飾的方法會在服務器卸載Servlet的時候運行,而且只會被服務器調用一次,相似於Servlet的destroy()方法。被@PreDestroy修飾的方法會在destroy()方法以後運行,在Servlet被完全卸載以前。執行順序以下所示。post
調用destroy()方法->@PreDestroy->destroy()方法->bean銷燬。學習
總結:@PostConstruct,@PreDestroy是Java規範JSR-250引入的註解,定義了對象的建立和銷燬工做,同一期規範中還有註解@Resource,Spring也支持了這些註解。
對@PostConstruct註解和@PreDestroy註解有了簡單的瞭解以後,接下來,咱們就寫一個簡單的程序來加深對這兩個註解的理解。
咱們建立一個Cat類,以下所示。
package io.mykit.spring.plugins.register.bean; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; /** * @author binghe * @version 1.0.0 * @description 測試@PostConstruct註解和@PreDestroy註解 */ public class Cat { public Cat(){ System.out.println("Cat類的構造方法..."); } public void init(){ System.out.println("Cat的init()方法..."); } @PostConstruct public void postConstruct(){ System.out.println("Cat的postConstruct()方法..."); } @PreDestroy public void preDestroy(){ System.out.println("Cat的preDestroy()方法..."); } public void destroy(){ System.out.println("Cat的destroy()方法..."); } }
能夠看到,在Cat類中,咱們提供了構造方法,init()方法、destroy()方法,使用 @PostConstruct註解標註的postConstruct()方法和只用@PreDestroy註解標註的preDestroy()方法。接下來,咱們在AnimalConfig類中使用@Bean註解將Cat類註冊到Spring容器中,以下所示。
@Bean(initMethod = "init", destroyMethod = "destroy") public Cat cat(){ return new Cat(); }
接下來,在BeanLifeCircleTest類中新建testBeanLifeCircle04()方法進行測試,以下所示。
@Test public void testBeanLifeCircle04(){ //建立IOC容器 AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AnimalConfig.class); //關閉IOC容器 context.close(); }
運行BeanLifeCircleTest類中的testBeanLifeCircle04()方法,輸出的結果信息以下所示。
Cat類的構造方法... Cat的postConstruct()方法... Cat的init()方法... Cat的preDestroy()方法... Cat的destroy()方法...
從輸出的結果信息中,能夠看出執行的順序是: 構造方法 -> @PostConstruct -> init()方法 -> @PreDestroy -> destroy()方法。
好了,我們今天就聊到這兒吧!別忘了給個在看和轉發,讓更多的人看到,一塊兒學習一塊兒進步!!
項目工程源碼已經提交到GitHub:https://github.com/sunshinelyz/spring-annotation
若是以爲文章對你有點幫助,請微信搜索並關注「 冰河技術 」微信公衆號,跟冰河學習Spring註解驅動開發。公衆號回覆「spring註解」關鍵字,領取Spring註解驅動開發核心知識圖,讓Spring註解驅動開發再也不迷茫。