【String註解驅動開發】你瞭解@PostConstruct註解和@PreDestroy註解嗎?

寫在前面

在以前的文章中,咱們介紹瞭如何使用@Bean註解指定初始化和銷燬的方法,小夥伴們能夠參見《【Spring註解驅動開發】如何使用@Bean註解指定初始化和銷燬的方法?看這一篇就夠了!!》,也介紹了使用InitializingBean和DisposableBean來處理bean的初始化和銷燬,小夥伴們能夠參見《【Spring註解驅動開發】Spring中的InitializingBean和DisposableBean,你真的瞭解嗎?》。除此以外,在JDK中也提供了兩個註解可以在bean加載到Spring容器以後執行和在bean銷燬以前執行,今天,咱們就一塊兒來看看這兩個註解的用法。java

項目工程源碼已經提交到GitHub:https://github.com/sunshinelyz/spring-annotationgit

@PostConstruct註解

@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註解

@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註解驅動開發再也不迷茫。

相關文章
相關標籤/搜索