阅读本文之前,请先阅读上篇博文Spring Bean后置处理器(BeanPostProcessor及其子接口)源码分析,本文将不再介绍BeanPostProcessor相关内容。
既然源码分析,我就直奔主题了。首先是org.springframework.context.support.AbstractApplicationContext.refresh()的源码:
public void refresh() throws BeansException, IllegalStateException {
synchronized (this.startupShutdownMonitor) {
//准备Refresh上下文环境,比如设置当前环境active=true,初始化及校验PropertySources
prepareRefresh();
// 刷新并获取bean工厂
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
// 准备bean工厂以供当前上下文中使用
prepareBeanFactory(beanFactory);
try {
// 允许在上下文子类中对bean工厂进行后置处理
postProcessBeanFactory(beanFactory);
// 调用上下文中注册为bean的工厂后置处理器
invokeBeanFactoryPostProcessors(beanFactory);
// 注册Bean后置处理器
registerBeanPostProcessors(beanFactory);
// Initialize message source for this context.
initMessageSource();
// Initialize event multicaster for this context.
initApplicationEventMulticaster();
// 初始化特定上下文子类中的其他特殊bean
onRefresh();
// 注册监听器
registerListeners();
// 实例化所有剩余的(非延迟初始化)单例.
finishBeanFactoryInitialization(beanFactory);
// 发布相应事件,完成刷新
finishRefresh();
}
catch (BeansException ex) {
if (logger.isWarnEnabled()) {
logger.warn("Exception encountered during context initialization - " +
"cancelling refresh attempt: " + ex);
}
// 发生异常,则销毁已经实例化的bean
destroyBeans();
// Reset 'active' flag.
cancelRefresh(ex);
// Propagate exception to caller.
throw ex;
}
finally {
// Reset common introspection caches in Spring's core, since we
// might not ever need metadata for singleton beans anymore...
resetCommonCaches();
}
}
}
接下来是生命周期执行顺序测试代码:
测试Bean代码(该Bean与NewsService循环依赖,为了执行循环依赖后置处理器)
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service("dependencyService")
public class DependencyService implements InitializingBean, DisposableBean,BeanNameAware,BeanFactoryAware {
private static final Logger _LOG = LoggerFactory.getLogger(DependencyService.class);
@Autowired
NewsServiceImpl newsServiceImpl;
public DependencyService() {
_LOG.info("=====执行DependencyService===的构造方法 实例化Bean");
}
@Override
public void afterPropertiesSet() throws Exception {
_LOG.info("=====执行InitializingBean===的afterPropertiesSet方法 ===Bean初始化完成,属性注入完成");
}
@PostConstruct
private void init() {
_LOG.info("=====执行Bean===的PostConstruct注解方法==Bean初始化依赖已经注入完成");
}
@PreDestroy
private void preDestroy() {
_LOG.info("=====执行Bean====的preDestroy方法 ==Bean销毁前");
}
@Override
public void destroy() throws Exception {
_LOG.info("=====执行DisposableBean===的destroy方法 ===Bean销毁");
}
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
_LOG.info("=====执行BeanFactoryAware===的setBeanFactory方法 ");
}
@Override
public void setBeanName(String name) {
_LOG.info("=====执行BeanNameAware===的setBeanName方法 ");
}
}
声明周期中相关后置处理器实现类
import java.lang.reflect.Constructor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.PropertyValues;
import org.springframework.beans.factory.config.SmartInstantiationAwareBeanPostProcessor;
import org.springframework.beans.factory.support.MergedBeanDefinitionPostProcessor;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.stereotype.Component;
@Component
public class BeanLifeCyclePostProcessor
implements MergedBeanDefinitionPostProcessor, SmartInstantiationAwareBeanPostProcessor {
private static final Logger _LOG = LoggerFactory.getLogger(BeanLifeCyclePostProcessor.class);
private static final String TEST_BEAN_NAME = "dependencyService";
@Override
public void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName) {
if (TEST_BEAN_NAME.equals(beanName))
_LOG.info("=====执行MergedBeanDefinitionPostProcessor \n" + "=====的postProcessMergedBeanDefinition方法 \n"
+ "=====缓存注解信息");
}
@Override
public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
if (TEST_BEAN_NAME.equals(beanName))
_LOG.info("=====执行InstantiationAwareBeanPostProcessor \n" + "=====的postProcessBeforeInstantiation方法 \n"
+ "=====得到bean实例前,返回代理,容器将实例化代理类");
return SmartInstantiationAwareBeanPostProcessor.super.postProcessBeforeInstantiation(beanClass, beanName);
}
@Override
public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
if (TEST_BEAN_NAME.equals(beanName))
_LOG.info("=====执行InstantiationAwareBeanPostProcessor \n" + "=====的postProcessAfterInstantiation方法 \n"
+ "=====Bean已经实例化但spring还没有注入属性,判断Bean是否需要跳过属性填充返回True则跳过属性填充");
return SmartInstantiationAwareBeanPostProcessor.super.postProcessAfterInstantiation(bean, beanName);
}
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
if (TEST_BEAN_NAME.equals(beanName))
_LOG.info("=====执行BeanPostProcessor \n" + "=====的postProcessBeforeInitialization方法 \n"
+ "=====Bean已经实例化执行初始化方法(init-method)前可以返回指定Bean的包装实例");
return MergedBeanDefinitionPostProcessor.super.postProcessBeforeInitialization(bean, beanName);
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if (TEST_BEAN_NAME.equals(beanName))
_LOG.info("=====执行BeanPostProcessor \n" + "=====的postProcessAfterInitialization方法 \n"
+ "=====Bean已经实例化执行初始化方法(init-method)后可以返回指定Bean的包装实例");
return MergedBeanDefinitionPostProcessor.super.postProcessAfterInitialization(bean, beanName);
}
@Override
public Constructor<?>[] determineCandidateConstructors(Class<?> beanClass, String beanName) throws BeansException {
if (TEST_BEAN_NAME.equals(beanName))
_LOG.info("=====执行SmartInstantiationAwareBeanPostProcessor \n" + "=====的determineCandidateConstructors方法 \n"
+ "=====Bean实例化之前,推断Bean的构造方法");
return SmartInstantiationAwareBeanPostProcessor.super.determineCandidateConstructors(beanClass, beanName);
}
@Override
public Object getEarlyBeanReference(Object bean, String beanName) throws BeansException {
if (TEST_BEAN_NAME.equals(beanName))
_LOG.info("=====执行SmartInstantiationAwareBeanPostProcessor \n" + "=====的getEarlyBeanReference方法 \n"
+ "=====Bean完全初始化之前,返回Bean的一个引用对象,通常用于解决循环依赖问题");
return SmartInstantiationAwareBeanPostProcessor.super.getEarlyBeanReference(bean, beanName);
}
@Override
public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName)
throws BeansException {
if (TEST_BEAN_NAME.equals(beanName))
_LOG.info("=====执行InstantiationAwareBeanPostProcessor \n" + "=====的postProcessProperties方法 \n"
+ "=====Bean实例化后进行属性填充");
return SmartInstantiationAwareBeanPostProcessor.super.postProcessProperties(pvs, bean, beanName);
}
}
主类(执行销毁bean操作)
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
@SpringBootApplication
public class BeanLifeCycleApplication {
public static void main(String[] args) {
ConfigurableApplicationContext applicationContext = SpringApplication
//此方法内部会调用第一段源码(refresh())
.run(BeanLifeCycleApplication.class, args);
//通过Bean工厂销毁bean
applicationContext.getBeanFactory().destroySingletons();
}
}
调用顺序日志
2019-12-31 10:07:32.472 INFO 11984 --- [ main] c.q.m.config.BeanLifeCyclePostProcessor :
=====执行InstantiationAwareBeanPostProcessor
=====的postProcessBeforeInstantiation方法
=====得到bean实例前,返回代理,容器将实例化代理类
2019-12-31 10:07:32.474 INFO 11984 --- [ main] c.q.m.config.BeanLifeCyclePostProcessor :
=====执行SmartInstantiationAwareBeanPostProcessor
=====的determineCandidateConstructors方法
=====Bean实例化之前,推断Bean的构造方法
2019-12-31 10:07:32.474 INFO 11984 --- [ main] c.q.m.service.impl.DependencyService :
=====执行DependencyService===的构造方法 实例化Bean
2019-12-31 10:07:32.475 INFO 11984 --- [ main] c.q.m.config.BeanLifeCyclePostProcessor :
=====执行MergedBeanDefinitionPostProcessor
=====的postProcessMergedBeanDefinition方法
=====缓存注解信息
2019-12-31 10:07:32.476 INFO 11984 --- [ main] c.q.m.config.BeanLifeCyclePostProcessor :
=====执行InstantiationAwareBeanPostProcessor
=====的postProcessAfterInstantiation方法
=====Bean已经实例化但spring还没有注入属性,判断Bean是否需要跳过属性填充返回True则跳过属性填充
2019-12-31 10:07:32.548 INFO 11984 --- [ main] c.q.m.config.BeanLifeCyclePostProcessor :
=====执行InstantiationAwareBeanPostProcessor
=====的postProcessProperties方法
=====Bean实例化后进行属性填充
2019-12-31 10:07:32.551 INFO 11984 --- [ main] c.q.m.service.impl.DependencyService :
=====执行BeanNameAware===的setBeanName方法
2019-12-31 10:07:32.551 INFO 11984 --- [ main] c.q.m.service.impl.DependencyService :
=====执行BeanFactoryAware===的setBeanFactory方法
2019-12-31 10:07:32.551 INFO 11984 --- [ main] c.q.m.service.impl.DependencyService :
=====执行Bean===的PostConstruct注解方法==Bean初始化依赖已经注入完成
2019-12-31 10:07:32.551 INFO 11984 --- [ main] c.q.m.config.BeanLifeCyclePostProcessor :
=====执行BeanPostProcessor
=====的postProcessBeforeInitialization方法
=====Bean已经实例化执行初始化方法(init-method)前可以返回指定Bean的包装实例
2019-12-31 10:07:32.551 INFO 11984 --- [ main] c.q.m.service.impl.DependencyService :
=====执行InitializingBean===的afterPropertiesSet方法 ===Bean初始化完成,属性注入完成
2019-12-31 10:07:32.552 INFO 11984 --- [ main] c.q.m.config.BeanLifeCyclePostProcessor :
=====执行BeanPostProcessor
=====的postProcessAfterInitialization方法
=====Bean已经实例化执行初始化方法(init-method)后可以返回指定Bean的包装实例
2019-12-31 10:07:33.608 INFO 11984 --- [ main] c.q.m.service.impl.DependencyService :
=====执行Bean====的preDestroy方法 ==Bean销毁前
2019-12-31 10:07:33.608 INFO 11984 --- [ main] c.q.m.service.impl.DependencyService :
=====执行DisposableBean===的destroy方法 ===Bean销毁
综上源码及测试代码分析可得Bean生命周期如下: