Spring中@PostConstruct注解的使用講解
1、定義
從JavaEE5規(guī)范開始,Servlet中增加了兩個影響Servlet生命周期的注解,@PostConstruct和@PreDestroy,這兩個注解被用來修飾一個非靜態(tài)的void()方法。
2、執(zhí)行順序及其使用場景
被@PostConstruct修飾的方法會在服務(wù)器加載Servlet的時候運(yùn)行,并且只會被服務(wù)器執(zhí)行一次。PostConstruct在構(gòu)造函數(shù)之后執(zhí)行,init()方法之前執(zhí)行。PreDestroy()方法在destroy()方法之后執(zhí)行
從依賴注入的字面意思可以知道,要將對象p注入到對象a,那么首先就必須得生成對象p和對象a,才能執(zhí)行注入。
所以,如果一個類A中有個成員變量p被@Autowried或@Resource注解,那么成員變量p注入是發(fā)生在a的構(gòu)造方法執(zhí)行完之后的。
如果想在生成對象時完成某些初始化操作,而偏偏這些初始化操作又依賴于依賴注入,那么這個初始化操作就無法在構(gòu)造函數(shù)中實(shí)現(xiàn)。
這時,可以使用@PostConstruct 注解一個方法來完成初始化,被@PostConstruct注解的方法將會在依賴注入完成后被自動調(diào)用。 所以,@PostConstruct的執(zhí)行順序如下:
靜態(tài)方法 >> Constructor >> @Autowired >> @PostConstruct
3、代碼演示
我們知道:如果對象p注入到對象a,在服務(wù)啟動時,會先執(zhí)行p的構(gòu)造方法,在執(zhí)行a的構(gòu)造方法。 那么如果對象p注入到對象a,且在對象p和對象a中都有@PostConstruct注解,那么在服務(wù)啟動時,他的初始化順序是什么呢,我們做個小測試,相關(guān)代碼如下:
@Service public class RoleService { static { System.out.println("RoleService static"); } public RoleService(){ System.out.println("RoleService Constructor"); } @PostConstruct public void init(){ System.out.println("RoleService PostConstruct"); } }
@Service public class UserService { @Resource private RoleService roleService; static { System.out.println("UserService static"); } public UserService(){ System.out.println("userService Constructor"); } @PostConstruct public void init(){ System.out.println("UserService PostConstruct"); } }
我們可以看到,RoleService注入到了UserService中,我們啟動程序,輸出結(jié)果如下:
RoleService static
RoleService Constructor
RoleService PostConstruct
UserService static
userService Constructor
UserService PostConstruct
結(jié)論:
如果對象p注入到對象a,且在對象p和對象a中都有@PostConstruct注解,那么在服務(wù)啟動時,他的初始化順序是: p static -> p Constructor -> p PostConstruct -> a static -> a Constructor -> a PostConstruct
需要注意:
Spring有默認(rèn)的類加載順序 如果UserService注入到了RoleService,類加載順序默認(rèn)是先加載RoleService,所以它的執(zhí)行順序就是 RoleService static -> RoleService Constructor -> UserService static -> UserService Constructor -> UserService PostConstruct -> RoleService PostConstruct
到此這篇關(guān)于Spring中@PostConstruct注解的使用講解的文章就介紹到這了,更多相關(guān)Spring中@PostConstruct注解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java INPUTSTREAM如何實(shí)現(xiàn)重復(fù)使用
這篇文章主要介紹了Java INPUTSTREAM如何實(shí)現(xiàn)重復(fù)使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-10-10Java Collection和Collections的區(qū)別
本文主要介紹了Java Collection和Collections的區(qū)別,Collection?是表示集合的接口,而?Collections?是對集合進(jìn)行操作的工具類,下面就來介紹一下具體用法,感興趣的可以了解一下2023-12-12SpringBoot動態(tài)定時任務(wù)實(shí)現(xiàn)完整版
最近有幸要開發(fā)個動態(tài)定時任務(wù),這里簡單再梳理一下,下面這篇文章主要給大家介紹了關(guān)于SpringBoot動態(tài)定時任務(wù)實(shí)現(xiàn)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02關(guān)于Java父類沒有無參構(gòu)造方法子類處理方法
父類無參構(gòu)造方法,子類不寫,其實(shí)會默認(rèn)調(diào)用父類的無參構(gòu)造方法也就是用super(),編譯運(yùn)行后,會打印出"子類會調(diào)用Father的第一個構(gòu)造方法,這篇文章給大家介紹關(guān)于Java父類沒有無參構(gòu)造方法子類處理方法,感興趣的朋友一起看看吧2024-01-01java serialVersionUID解決序列化類版本不一致問題面試精講
這篇文章主要為大家介紹了serialVersionUID解決序列化類版本不一致問題的面試精講,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10java實(shí)現(xiàn)系統(tǒng)捕獲異常發(fā)送郵件案例
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)系統(tǒng)捕獲異常發(fā)送郵件案例,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-11-11