Java中的@PostConstruct注解
@PostConstruct基本:
@PostConstruct注解好多人以為是Spring提供的。其實是Java自己的注解。
Java中該注解的說明:@PostConstruct該注解被用來修飾一個非靜態(tài)的void()方法。被@PostConstruct修飾的方法會在服務器加載Servlet的時候運行,并且只會被服務器執(zhí)行一次。PostConstruct在構(gòu)造函數(shù)之后執(zhí)行,init()方法之前執(zhí)行。
通常我們會是在Spring框架中使用到@PostConstruct注解 該注解的方法在整個Bean初始化中的執(zhí)行順序:
Constructor(構(gòu)造方法) -> @Autowired(依賴注入) -> @PostConstruct(注釋的方法)
應用:在靜態(tài)方法中調(diào)用依賴注入的Bean中的方法。
package com.example.studySpringBoot.util; import com.example.studySpringBoot.service.MyMethorClassService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; @Component public class MyUtils { private static MyUtils staticInstance = new MyUtils(); @Autowired private MyMethorClassService myService; @PostConstruct public void init(){ staticInstance.myService = myService; } public static Integer invokeBean(){ return staticInstance.myService.add(10,20); } }
那么Java提供的@PostConstruct注解,Spring是如何實現(xiàn)的呢?
需要先學習下BeanPostProcessor這個接口:
public interface BeanPostProcessor { /** * Apply this BeanPostProcessor to the given new bean instance <i>before</i> any bean * initialization callbacks (like InitializingBean's {@code afterPropertiesSet} * or a custom init-method). The bean will already be populated with property values. * The returned bean instance may be a wrapper around the original. * * 任何Bean實例化,并且Bean已經(jīng)populated(填充屬性) 就會回調(diào)這個方法 * */ Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException; /** * Apply this BeanPostProcessor to the given new bean instance <i>after</i> any bean * initialization callbacks (like InitializingBean's {@code afterPropertiesSet} * or a custom init-method). The bean will already be populated with property values. * The returned bean instance may be a wrapper around the original. * * 任何Bean實例化,并且Bean已經(jīng)populated(填充屬性) 就會回調(diào)這個方法 * */ Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;
那Spring初始化是那里回調(diào)這些方法呢?
AbstractApplicationContext.finishBeanFactoryInitialization(...); beanFactory.preInstantiateSingletons(); DefaultListableBeanFactory.getBean(beanName); AbstractBeanFactory.doGetBean(); AbstractAutowireCapableBeanFactory.createBean(....) populateBean(beanName, mbd, instanceWrapper); initializeBean(...) //調(diào)用BeanPostProcessor.postProcessBeforeInitialization()方法 applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName); //調(diào)用BeanPostProcessor.postProcessBeforeInitialization()方法 applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
BeanPostProcessor有個實現(xiàn)類CommonAnnotationBeanPostProcessor,就是專門處理@PostConstruct @PreDestroy注解。
CommonAnnotationBeanPostProcessor的父類InitDestroyAnnotationBeanPostProcessor() InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization() InitDestroyAnnotationBeanPostProcessor.findLifecycleMetadata() // 組裝生命周期元數(shù)據(jù) InitDestroyAnnotationBeanPostProcessor.buildLifecycleMetadata() // 查找@PostConstruct注釋的方法 InitDestroyAnnotationBeanPostProcessor.initAnnotationType // 查找@PreDestroy注釋方法 InitDestroyAnnotationBeanPostProcessor.destroyAnnotationType // 反射調(diào)用 metadata.invokeInitMethods(bean, beanName);
到此這篇關(guān)于Java中的@PostConstruct注解的文章就介紹到這了,更多相關(guān)Java @PostConstruct注解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Shiro整合Springboot和redis,jwt過程中的錯誤shiroFilterChainDefinition問
這篇文章主要介紹了Shiro整合Springboot和redis,jwt過程中的錯誤shiroFilterChainDefinition問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-04-04SpringBoot JavaMailSender發(fā)送郵件功能
這篇文章主要為大家詳細介紹了SpringBoot JavaMailSender發(fā)送郵件功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-04-04Java微信公眾平臺開發(fā)(10) 微信自定義菜單的創(chuàng)建實現(xiàn)
這篇文章主要為大家詳細介紹了Java微信公眾平臺開發(fā)第十步,微信自定義菜單的創(chuàng)建實現(xiàn),具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-04-04淺談Spring Data如何簡化數(shù)據(jù)操作的方法
這篇文章主要介紹了看Spring Data如何簡化數(shù)據(jù)操作的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-04-04