@PostConstruct註解作用

從Java EE5規範開始,Servlet中增加了兩個影響Servlet生命週期的註解,@PostConstruct和@PreDestroy,這兩個註解被用來修飾一個非靜態的void()方法,並且被修飾的方法不能拋出異常。

寫法有如下兩種方式:

@PostConstruct
public void method(){}

public @PostConstruct void method(){}

被@PostConstruct修飾的方法會在服務器加載Servlet的時候運行,並且只會被服務器調用一次,類似於Serclet的init()方法。被@PostConstruct修飾的方法會在構造函數之後,init()方法之前運行。

被@PreDestroy修飾的方法會在服務器卸載Servlet的時候運行,並且只會被服務器調用一次,類似於Servlet的destroy()方法。被@PreDestroy修飾的方法會在destroy()方法之後運行,在Servlet被徹底卸載之前。

服務器加載Servlet過程:

                                                                            

另外,spring中Constructor、@Autowired、@PostConstruct的順序:

其實從依賴注入的字面意思就可以知道,要將對象B注入到對象A,那麼首先就必須得生成對象A和對象B,才能執行注入。所以,如果一個類A中有個成員變量b被@Autowried註解,那麼@Autowired注入是發生在A的構造方法執行完之後的。

如果想在生成對象時完成某些初始化操作,而偏偏這些初始化操作又依賴於依賴注入,那麼久無法在構造函數中實現。爲此,可以使用@PostConstruct註解一個方法來完成初始化,@PostConstruct註解的方法將會在依賴注入完成後被自動調用。

Constructor >> @Autowired >> @PostConstruct

舉個栗子:

@Component
public class A {

    @Autowired
    private B b;

    public A() {
        System.out.println("執行A的構造方法,此時b還未被注入: b = " + b);
    }

    @PostConstruct
    private void init() {
        System.out.println("@PostConstruct將在依賴注入完成後被自動調用: b = " + b);
    }
}

@Component
public class B {
    public B(){
        System.out.println("執行B的構造方法");
    }
}

測試類:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:application-context.xml"})
public class MessageTest {

    @Resource
    A a;

    @Test
    public void testAB(){
    }
}

執行testAB()方法結果:

執行A的構造方法,此時b還未被注入: b = null
執行B的構造方法
@PostConstruct將在依賴注入完成後被自動調用: b = com.nss.B@51841ac6

通過以上結果可以看出:被@PostConstruct註解的方法將在該類中所有注入操作完成之後執行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章