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