容器的扩展功能
设置路径
扩展功能
public void refresh() throws BeansException, IllegalStateException {
synchronized(this.startupShutdownMonitor) {
//准备刷新的上下文环境
this.prepareRefresh();
//初始化BeanFactory,并进行XML文件读取
ConfigurableListableBeanFactory beanFactory = this.obtainFreshBeanFactory();
// 进行各种功能填充
this.prepareBeanFactory(beanFactory);
try {
//子类覆盖方法做额外处理
this.postProcessBeanFactory(beanFactory);
//激活各种BeanFactory处理器
this.invokeBeanFactoryPostProcessors(beanFactory);
//注册拦截Bean创建的Bean处理器,这里只是注册,真正调用是在getBean时候
this.registerBeanPostProcessors(beanFactory);
//为上下文初始化Message源,即不同语言的消息体,国际化处理
this.initMessageSource();
// 初始化应用消息广播器,并放入applicationEventMulticasterBean中
this.initApplicationEventMulticaster();
// 留给子类来初始化其他的Bean
this.onRefresh();
// 在所有注册的Bean中查找ListenerBean,注册到广播器中
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 {
this.resetCommonCaches();
}
}
}
- 准备刷新的上下文环境
- 初始化BeanFactory,并进行XML文件读取
- 进行各种功能填充
- 子类覆盖方法做额外处理
- 激活各种BeanFactory处理器
- 注册拦截Bean创建的Bean处理器,这里只是注册,真正调用是在getBean时候
- 为上下文初始化Message源,即不同语言的消息体,国际化处理
- 初始化应用消息广播器,并放入applicationEventMulticasterBean中
- 留给子类来初始化其他的Bean
- 在所有注册的Bean中查找ListenerBean,注册到广播器中
- 初始化剩下的单实例
- 完成刷新过程,通知生命周期处理器
加载BeanFactory
- 创建DefaultListableBeanFactory
- 指定序列化ID
- 定制BeanFactory
- 加载BeanDefinition
- 使用全局变量记录BeanFactory类的实例