完整Spring Bean的生命周期源码解析

阅读本文之前,请先阅读上篇博文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生命周期如下:
在这里插入图片描述

发布了105 篇原创文章 · 获赞 7 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_43792385/article/details/103778542