@PostConstruct注解會(huì)用指南
點(diǎn)擊上方 Java學(xué)習(xí)之道,選擇 設(shè)為星標(biāo)
來源: blog.csdn.net/qq360694660/article/details/82877222
作者: 那些很冒險(xiǎn)的夢(mèng)丶
Part1@PostConstruct基本
@PostConstruct注解好多人以為是Spring提供的。其實(shí)是Java自己的注解。
Java中該注解的說明
@PostConstruct該注解被用來修飾一個(gè)非靜態(tài)的void()方法。被@PostConstruct修飾的方法會(huì)在服務(wù)器加載Servlet的時(shí)候運(yùn)行,并且只會(huì)被服務(wù)器執(zhí)行一次。PostConstruct在構(gòu)造函數(shù)之后執(zhí)行,init()方法之前執(zhí)行。
通常我們會(huì)是在Spring框架中使用到@PostConstruct注解
該注解的方法在整個(gè)Bean初始化中的執(zhí)行順序:
Constructor(構(gòu)造方法) -> @Autowired(依賴注入) -> @PostConstruct(注釋的方法)
應(yīng)用:在靜態(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是如何實(shí)現(xiàn)的呢?需要先學(xué)習(xí)下BeanPostProcessor這個(gè)接口
Part2BeanPostProcessor接口
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實(shí)例化,并且Bean已經(jīng)populated(填充屬性) 就會(huì)回調(diào)這個(gè)方法
*
*/
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實(shí)例化,并且Bean已經(jīng)populated(填充屬性) 就會(huì)回調(diào)這個(gè)方法
*
*/
Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;
Part3Spring初始化是那里回調(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有個(gè)實(shí)現(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);
-
| 更多精彩文章 -

▽加我微信,交個(gè)朋友 長(zhǎng)按/掃碼添加↑↑↑
評(píng)論
圖片
表情


