Spring中的@PostConstruct注解使用方法解析
一 @PostConstruct注解的來(lái)由
構(gòu)造方法和@Autowired注解
一般情況下我們大多用@Autowired來(lái)完成某個(gè)類中的屬性的注入。 @Autowired這個(gè)注解在構(gòu)造方法執(zhí)行后執(zhí)行,以如下為例:就是在通過(guò)構(gòu)造方法生成FileTaskExecutor 和FileTaskHandlerFactory這兩個(gè)對(duì)象后,再把生成的這個(gè)FileTaskHandlerFactory對(duì)象賦值到FileTaskExecutor 中的fileTaskHandlerFactory屬性上。 有點(diǎn)類似set方法。
@Component("backendFileTaskExecutor") public class FileTaskExecutor { @Autowired private FileTaskHandlerFactory fileTaskHandlerFactory; }
二 @PostConstruct注解
1 從需求方面講解@PostConstruct注解的來(lái)由
@Autowired這個(gè)注解能解決一部分復(fù)雜功能的屬性的賦值,當(dāng)時(shí)對(duì)于一些比較零散的初始值的創(chuàng)建,用@Autowired這個(gè)注解就有點(diǎn)多余了,因?yàn)橄袢缦拢築lockingQueue<FileTaskDTO>,Executor ,Limiter ,Map<Long, FileTaskDTO>這些屬性我只想簡(jiǎn)單的new一個(gè)對(duì)象或是賦值一個(gè)固定值,這個(gè)時(shí)候我們還要單獨(dú)的創(chuàng)建一個(gè)類(這個(gè)類里面單單只是new一個(gè)對(duì)象,或者設(shè)置一個(gè)固定值)然后再用@Autowired注入屬性,這樣操作就有點(diǎn)雞肋了。
@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這個(gè)注解就誕生了,它就是用來(lái)處理在@Autowired注入屬性后init()方法之前,對(duì)一些零散的屬性進(jìn)行賦值的注解。 如上面被@PostConstruct修飾的的initParams()方法。
2 @PostConstruct
- 除了攔截器這個(gè)特殊情況以外,其他情況都不允許有參數(shù),否則spring框架會(huì)報(bào)IllegalStateException;而且返回值要是void,但實(shí)際也可以有返回值,至少不會(huì)報(bào)錯(cuò),只會(huì)忽略
- 方法隨便你用什么權(quán)限來(lái)修飾,public、protected、private都可以,反正功能是由反射來(lái)實(shí)現(xiàn)
- 方法不可以是static的,但可以是final的
所以,綜上所述,在spring項(xiàng)目中,在一個(gè)bean的初始化過(guò)程中,方法執(zhí)行先后順序?yàn)?/p>
Constructor > @Autowired > @PostConstruct
先執(zhí)行完構(gòu)造方法,再注入依賴,最后執(zhí)行初始化操作,所以這個(gè)注解就避免了一些需要在構(gòu)造方法里使用依賴組件的尷尬。
3 其它將屬性注入bean對(duì)象的方法
- 定義靜態(tài)常量。
- Constructor
- @Autowired
- @PostConstruct注解
- 實(shí)現(xiàn)InitializingBean接口重寫(xiě)afterPropertiesSet()方法
- 實(shí)現(xiàn)CommandLineRunner或者ApplicationRunner接口,他們?cè)谌萜鲉?dòng)后啟動(dòng)
值得注意的是第4個(gè)是在tomcat服務(wù)啟動(dòng)之后才開(kāi)始的。第3個(gè)是在spring容器啟動(dòng)之后,bean對(duì)象的構(gòu)造方法完成后啟動(dòng)的。 他們具有如下關(guān)系:
spring容器啟動(dòng) > Constructor > @Autowired > @PostConstruct > InitializingBean > CommandLineRunner或者ApplicationRunner`接口
注意:bean對(duì)象的初始化是挨個(gè)進(jìn)行的(上一個(gè)完成才能進(jìn)行下一個(gè)),如果某個(gè)bean對(duì)象中的@PostConstruct方法內(nèi)的邏輯處理過(guò)長(zhǎng)就會(huì)導(dǎo)致spring的啟動(dòng)時(shí)間邊長(zhǎng),因?yàn)橹挥性谒械腷ean對(duì)象初始化完成之后springBoot才會(huì)打開(kāi)端口提供服務(wù)。 如果出現(xiàn)如上問(wèn)題的化可以采用實(shí)現(xiàn)CommandLineRunner或者ApplicationRunner接口的方法來(lái)注入一些數(shù)據(jù),因?yàn)檫@一步是在springboot啟動(dòng)完成之后在運(yùn)行的
到此這篇關(guān)于Spring中的@PostConstruct注解使用方法解析的文章就介紹到這了,更多相關(guān)Spring中的@PostConstruct注解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringMVC中的Model對(duì)象用法說(shuō)明
這篇文章主要介紹了SpringMVC中的Model對(duì)象用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06Springboot非分布式定時(shí)任務(wù)實(shí)現(xiàn)代碼
這篇文章主要介紹了Springboot非分布式定時(shí)任務(wù)實(shí)現(xiàn)代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11Springboot?配置線程池創(chuàng)建線程及配置?@Async?異步操作線程池詳解
這篇文章主要介紹了Springboot?配置線程池創(chuàng)建線程及配置?@Async?異步操作線程池詳解,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09idea整合deepseek實(shí)現(xiàn)AI輔助編程的流程步驟
文章介紹了如何在IntelliJ IDEA中整合DeepSeek平臺(tái)實(shí)現(xiàn)AI輔助編程,步驟包括安裝CodeGPT插件、注冊(cè)DeepSeek開(kāi)發(fā)者賬號(hào)、配置API密鑰以及設(shè)置API信息,需要的朋友可以參考下2025-02-02Java實(shí)現(xiàn)簡(jiǎn)易提款機(jī)
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡(jiǎn)易提款機(jī),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01spring中的BeanFactory與FactoryBean的講解
今天小編就為大家分享一篇關(guān)于spring中的BeanFactory與FactoryBean的講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-01-01java web實(shí)現(xiàn)自動(dòng)登錄
這篇文章主要為大家詳細(xì)介紹了java web實(shí)現(xiàn)自動(dòng)登錄,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08Spring Boot集成Redis實(shí)戰(zhàn)操作功能
這篇文章主要介紹了Spring Boot集成Redis實(shí)戰(zhàn)操作,包括如何集成redis以及redis的一些優(yōu)點(diǎn),本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-11-11