Spring中的@PostConstruct注解使用方法解析
一 @PostConstruct注解的來由
構(gòu)造方法和@Autowired注解
一般情況下我們大多用@Autowired來完成某個類中的屬性的注入。 @Autowired這個注解在構(gòu)造方法執(zhí)行后執(zhí)行,以如下為例:就是在通過構(gòu)造方法生成FileTaskExecutor 和FileTaskHandlerFactory這兩個對象后,再把生成的這個FileTaskHandlerFactory對象賦值到FileTaskExecutor 中的fileTaskHandlerFactory屬性上。 有點類似set方法。
@Component("backendFileTaskExecutor")
public class FileTaskExecutor {
@Autowired
private FileTaskHandlerFactory fileTaskHandlerFactory;
}
二 @PostConstruct注解
1 從需求方面講解@PostConstruct注解的來由
@Autowired這個注解能解決一部分復(fù)雜功能的屬性的賦值,當(dāng)時對于一些比較零散的初始值的創(chuàng)建,用@Autowired這個注解就有點多余了,因為像如下:BlockingQueue<FileTaskDTO>,Executor ,Limiter ,Map<Long, FileTaskDTO>這些屬性我只想簡單的new一個對象或是賦值一個固定值,這個時候我們還要單獨的創(chuàng)建一個類(這個類里面單單只是new一個對象,或者設(shè)置一個固定值)然后再用@Autowired注入屬性,這樣操作就有點雞肋了。
@Component("backendFileTaskExecutor")
public class FileTaskExecutor {
@Autowired
private FileTaskHandlerFactory fileTaskHandlerFactory;
private BlockingQueue<FileTaskDTO> taskQueue;
private Executor executor;
private Limiter limiter;
private Map<Long, FileTaskDTO> handlingTask;
@PostConstruct
public void initParams() {
taskQueue = new ArrayBlockingQueue<>(MAX_POOL_TASK_SIZE);
handlingTask = new ConcurrentHashMap<>();
limiter = new Limiter(configService.getMaxPermitUsers(), configService.getMaxPermitPerUserTasks());
executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() * 2);
executor.execute(new Boss());
cleanTempFile();
}
}
所以@PostConstruct這個注解就誕生了,它就是用來處理在@Autowired注入屬性后init()方法之前,對一些零散的屬性進(jìn)行賦值的注解。 如上面被@PostConstruct修飾的的initParams()方法。
2 @PostConstruct
- 除了攔截器這個特殊情況以外,其他情況都不允許有參數(shù),否則spring框架會報IllegalStateException;而且返回值要是void,但實際也可以有返回值,至少不會報錯,只會忽略
- 方法隨便你用什么權(quán)限來修飾,public、protected、private都可以,反正功能是由反射來實現(xiàn)
- 方法不可以是static的,但可以是final的
所以,綜上所述,在spring項目中,在一個bean的初始化過程中,方法執(zhí)行先后順序為
Constructor > @Autowired > @PostConstruct
先執(zhí)行完構(gòu)造方法,再注入依賴,最后執(zhí)行初始化操作,所以這個注解就避免了一些需要在構(gòu)造方法里使用依賴組件的尷尬。

3 其它將屬性注入bean對象的方法
- 定義靜態(tài)常量。
- Constructor
- @Autowired
- @PostConstruct注解
- 實現(xiàn)InitializingBean接口重寫afterPropertiesSet()方法
- 實現(xiàn)CommandLineRunner或者ApplicationRunner接口,他們在容器啟動后啟動
值得注意的是第4個是在tomcat服務(wù)啟動之后才開始的。第3個是在spring容器啟動之后,bean對象的構(gòu)造方法完成后啟動的。 他們具有如下關(guān)系:
spring容器啟動 > Constructor > @Autowired > @PostConstruct > InitializingBean > CommandLineRunner或者ApplicationRunner`接口
注意:bean對象的初始化是挨個進(jìn)行的(上一個完成才能進(jìn)行下一個),如果某個bean對象中的@PostConstruct方法內(nèi)的邏輯處理過長就會導(dǎo)致spring的啟動時間邊長,因為只有在所有的bean對象初始化完成之后springBoot才會打開端口提供服務(wù)。 如果出現(xiàn)如上問題的化可以采用實現(xiàn)CommandLineRunner或者ApplicationRunner接口的方法來注入一些數(shù)據(jù),因為這一步是在springboot啟動完成之后在運(yùn)行的
到此這篇關(guān)于Spring中的@PostConstruct注解使用方法解析的文章就介紹到這了,更多相關(guān)Spring中的@PostConstruct注解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java刪除ArrayList中的重復(fù)元素的兩種方法
在Java編程中,ArrayList是一種常用的集合類,它允許我們存儲一組元素,在某些情況下,我們可能需要移除其中重復(fù)的元素,只保留唯一的元素,下面介紹兩種常見的刪除ArrayList中重復(fù)元素的方法,需要的朋友可以參考下2024-12-12
Java gRPC攔截器簡單實現(xiàn)分布式日志鏈路追蹤器過程詳解
有請求的發(fā)送、處理,當(dāng)然就會有攔截器的需求,例如在服務(wù)端通過攔截器統(tǒng)一進(jìn)行請求認(rèn)證等操作,這些就需要攔截器來完成,今天松哥先和小伙伴們來聊一聊gRPC中攔截器的基本用法,后面我再整一篇文章和小伙伴們做一個基于攔截器實現(xiàn)的JWT認(rèn)證的gRPC2023-03-03
HandlerMapping之RequestMappingHandlerMapping作用詳解
這篇文章主要介紹了HandlerMapping之RequestMappingHandlerMapping作用詳解,HandlerMapping是用來尋找Handler的,并不與Handler的類型或者實現(xiàn)綁定,而是根據(jù)需要定義的,那么為什么要單獨給@RequestMapping實現(xiàn)一個HandlerMapping,需要的朋友可以參考下2023-10-10
java開發(fā)AOP基礎(chǔ)JdkDynamicAopProxy
這篇文章主要為大家介紹了java開發(fā)AOP基礎(chǔ)JdkDynamicAopProxy源碼示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07
Java 單元測試之Mockito 模擬靜態(tài)方法與私有方法最佳實踐
本文將深入探討如何使用 Mockito 來模擬靜態(tài)方法和私有方法,結(jié)合大量實戰(zhàn)代碼示例,帶你突破傳統(tǒng)單元測試的邊界,寫出更徹底、更獨立、更具可讀性的測試用例,感興趣的朋友跟隨小編一起看看吧2025-09-09

