文章目录
写在前面
在 Spring Bean 描述了一个 bean 的生命周期,那么这些生命周期中的方法是什么时候执行调用的呢?
refresh() 方法在 ConfigurableApplicationContext 接口中定义,而具体的实现是在 AbstractApplicationContext 中。
refresh() 方法是一个启动方法,调用该方法后,会实例化所有单例以及非单例的对象。
而通过 refresh() ,可以学习到 Spring 是如何初始化 bean 的,分析过程如下:
- 怎么处理BeanPostProcessor
- 怎么处理InitializingBean
- 怎么处理DisposableBean
- 怎么处理init-method
refresh
我们先来看看 refresh() :
public void refresh() throws BeansException, IllegalStateException {
synchronized(this.startupShutdownMonitor) {
//刷新加载之前的上下文
this.prepareRefresh();
//告诉子类刷新内部bean工厂
ConfigurableListableBeanFactory beanFactory = this.obtainFreshBeanFactory();
//准备在上下文中使用的 bean 工厂
this.prepareBeanFactory(beanFactory);
try {
//允许上下文的子类去执行postProcessor
this.postProcessBeanFactory(beanFactory);
// 开始执行注册到该上下文的BeanFactoryPostProcessors
this.invokeBeanFactoryPostProcessors(beanFactory);
// 开始注册BeanPostProcessor来拦截其他的bean的初始化过程
this.registerBeanPostProcessors(beanFactory);
//初始化上下文的消息源
this.initMessageSource();
//初始化上下文的事件传播器
this.initApplicationEventMulticaster();
//在特定上下文子类中初始化其他特殊bean
this.onRefresh();
//检查监听器bean并注册
this.registerListeners();
//实例化所有剩余的单例
this.finishBeanFactoryInitialization(beanFactory);
//发布相应的事件
this.finishRefresh();
} catch (BeansException var9) {
if (this.logger.isWarnEnabled()) {
this.logger.warn("Exception encountered during context initialization - cancelling refresh attempt: " + var9);
}
this.destroyBeans();
this.cancelRefresh(var9);
throw var9;
} finally