深入源碼理解SpringBean生命周期
點(diǎn)擊上方藍(lán)色字體,選擇“標(biāo)星公眾號(hào)”
優(yōu)質(zhì)文章,第一時(shí)間送達(dá)
作者 | DeepSleeping丶
來源 | urlify.cn/jy6NJr
76套java從入門到精通實(shí)戰(zhàn)課程分享
概述
本文描述下Spring的實(shí)例化、初始化、銷毀,整個(gè)SpringBean生命周期,聊一聊BeanPostProcessor的回調(diào)時(shí)機(jī)、Aware方法的回調(diào)時(shí)機(jī)、初始化方法的回調(diào)及其順序、銷毀方法的回調(diào)及其順序、重要的BeanPostProcessor的介紹。
開頭是一張我畫的調(diào)用流轉(zhuǎn)圖,然后就是我寫的一個(gè)Demo通過日志打印了SpringBean的生命周期,最后通過源碼慢慢跟進(jìn)其生命周期。
生命周期流轉(zhuǎn)圖

生命周期Demo
如下對(duì)某一個(gè)Bean進(jìn)行g(shù)etBean操作,最后銷毀上下文,通過日志來查看SpringBean的生命周期
代碼
package com.deepz.spring;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor;
import org.springframework.beans.factory.support.MergedBeanDefinitionPostProcessor;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.EnvironmentAware;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
@Slf4j
@Configuration
public class BeanLifeCycleManager {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(BeanLifeCycleManager.class);
context.getBean("beanLifeCycle");
context.close();
}
@Bean(initMethod = "init", destroyMethod = "destroyMethod")
public BeanLifeCycle beanLifeCycle() {
return new BeanLifeCycle();
}
interface MyAware extends ApplicationContextAware, EnvironmentAware, BeanFactoryAware {
}
@Component
static class MyMergedBeanDefinitionPostProcessor implements MergedBeanDefinitionPostProcessor {
@Override
public void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName) {
if ("beanLifeCycle".equals(beanName)) {
log.info(">>>>>>>>>>元信息收集 ,MergedBeanDefinitionPostProcessor#postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName) \nbeanDefinition = [{}]\n,beanType = [{}],beanName = [{}]\n", beanDefinition, beanType, beanName);
}
}
}
@Component
static class MyInstantiationAwareBeanPostProcessor implements InstantiationAwareBeanPostProcessor {
@Override
public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
if ("beanLifeCycle".equals(beanName)) {
log.info(">>>>>>>>>>實(shí)例化前,InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation(Class<?> beanClass,String beanName) \nbeanClass = [{}],beanName = [{}]\n", beanClass, beanName);
}
return null;
}
@Override
public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
if ("beanLifeCycle".equals(beanName)) {
log.info(">>>>>>>>>>實(shí)例化后,InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation(Object bean, String beanName)\nbean = [{}],beanName = [{}]\n", bean, beanName);
}
return false;
}
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
if ("beanLifeCycle".equals(beanName)) {
log.info(">>>>>>>>>>初始化前,InstantiationAwareBeanPostProcessor#postProcessBeforeInitialization(Object bean, String beanName)\nbean= [{}],beanName = [{}]\n", bean, beanName);
}
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if ("beanLifeCycle".equals(beanName)) {
log.info(">>>>>>>>>>初始化后,InstantiationAwareBeanPostProcessor#postProcessAfterInitialization(Object bean, String beanName)\nbean= [{}],beanName = [{}]\n", bean, beanName);
}
return bean;
}
}
public static class BeanLifeCycle implements InitializingBean, MyAware, DisposableBean {
public void init() {
log.info(">>>>>>>>>>init-method\n");
}
@PostConstruct
public void postConstruct() {
log.info(">>>>>>>>>>postConstruct\n");
}
@Override
public void afterPropertiesSet() throws Exception {
log.info(">>>>>>>>>>afterPropertiesSet\n");
}
public void destroyMethod() {
log.info(">>>>>>>>>>destroy-method\n");
}
@Override
public void destroy() {
log.info(">>>>>>>>>>DisposableBean-destroy\n");
}
@PreDestroy
public void preDestroy(){
log.info(">>>>>>>>>>preDestroy\n");
}
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
log.info(">>>>>>>>>>BeanFactoryAware#setBeanFactory\n");
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
log.info(">>>>>>>>>>ApplicationContextAware#setApplicationContext\n");
}
@Override
public void setEnvironment(Environment environment) {
log.info(">>>>>>>>>>EnvironmentAware#setEnvironment\n");
}
}
}執(zhí)行結(jié)果

實(shí)例化前
從createBean開始,見證Bean的實(shí)例化過程,首先是Bean實(shí)例化前的一個(gè)擴(kuò)展點(diǎn),它允許你自定義返回Bean實(shí)例。(AOP生成代理對(duì)象的入口之一,但基本不會(huì)走這里)
回調(diào)Bean實(shí)例化前的方法
AbstractAutowireCapableBeanFactory#createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
主要是為了回調(diào)所有InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation(Class<?> beanClass, String beanName)方法,該方法會(huì)返回Object對(duì)象,如果返回的Object不為空,則會(huì)回調(diào)所有BeanPostProcessor的postProcessAfterInitialization(Object bean, String beanName)方法,那么返回的Object則會(huì)作為Bean去處理,如果返回Null,那么后續(xù)就會(huì)交由Spring來實(shí)例化、初始化(doCreateBean)。


自定義攔截實(shí)例化Bean后回調(diào)Bean后置方法


實(shí)例化
AbstractAutowireCapableBeanFactory#doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
如源碼所示,如果上述擴(kuò)展點(diǎn)沒有return,那么就會(huì)進(jìn)入到doCreateBean方法
首先是對(duì)Bean進(jìn)行實(shí)例化,其中包括了構(gòu)造器推斷等,本文不過多聊這塊內(nèi)容,最后會(huì)返回BeanWrapper包裹的Bean實(shí)例。
元信息收集
實(shí)例化之后Spring通過回調(diào)MergedBeanDefinitionPostProcessor#postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName)對(duì)一些元信息做了收集維護(hù)處理,如@Autowire、@Resource、@PostConstruct 和 @PreDestroy等,為后續(xù)屬性注入做準(zhǔn)備。
MergedBeanDefinitionPostProcessor的實(shí)現(xiàn)類

MergedBeanDefinitionPostProcessor回調(diào)

初始化
實(shí)例化完了,對(duì)一些需要收集的信息也準(zhǔn)備好了,后續(xù)就是進(jìn)行屬性注入和回調(diào)初始化方法了,其中populateBean方法是屬性填充,initializeBean是回調(diào)初始化方法。
InstatiationAwareBeanPostProcessor回調(diào)postProcessAfterInstantiation方法
AbstractAutowireCapableBeanFactory#populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw)
Aware接口回調(diào)
AbstractAutowireCapableBeanFactory#initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd)
部分Aware接口回調(diào)、BeanPostProcessor的初始化前置回調(diào)(包括PostConstruct的調(diào)用、其余Aware的回調(diào))、afterPropertiesSet回調(diào)、自定義init方法回調(diào)、BeanPostProcessor的初始化后置回調(diào)

部分Aware回調(diào)
AbstractAutowireCapableBeanFactory#invokeAwareMethods(final String beanName, final Object bean
BeanPostProcessor的初始化前置回調(diào)

重要BeanPostProcessor如下:
ApplicationContextAwareProcessor#postProcessBeforeInitialization(final Object bean, String beanName)回調(diào)剩余Aware方法

InitDestroyAnnotationBeanPostProcessor#postProcessBeforeInitialization(final Object bean, String beanName)回調(diào)PostConstruct方法


回調(diào)初始化方法
AbstractAutowireCapableBeanFactory#invokeInitMethods(String beanName, final Object bean, @Nullable RootBeanDefinition mbd)
先回調(diào)InitializingBean的afterPropertiesSet方法,隨后回調(diào)自定義的init-method
BeanPostProcessor的初始化后置回調(diào)
注意:AOP生成代理的主要入口便是這里的了,對(duì)應(yīng)的BeanPostProcessor->AbstractAutoProxyCreator。(后續(xù)單聊AOP相關(guān)源碼,F(xiàn)LAG)
銷毀
銷毀方法最終會(huì)走到DisposableBeanAdapter的destroy方法去做處理,與初始化方法類似,這里簡單介紹把。
看圖就能發(fā)現(xiàn),順序執(zhí)行的,先是注解方法,然后是DisposableBean的回調(diào),最后是自定義的銷毀方法,就是如此簡單。
粉絲福利:Java從入門到入土學(xué)習(xí)路線圖
??????

??長按上方微信二維碼 2 秒
感謝點(diǎn)贊支持下哈 
