一. 先上源码为敬
public void refresh() throws BeansException, IllegalStateException {
//刷新前的预处理
prepareRefresh();
// 获取BeanFactory
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
// BeanFactory的预准备工作(BeanFactory进行一些设置)
prepareBeanFactory(beanFactory);
// BeanFactory准备工作完成后进行的后置处理工作,子类通过重写这个方法来在BeanFactory创建并预准备完成以后 做进一步的设置
postProcessBeanFactory(beanFactory);
// 执行BeanFactoryPostProcessor的后置处理方法
invokeBeanFactoryPostProcessors(beanFactory);
// 注册BeanPostProcessors,此时并不执行这些bean的后置处理器
registerBeanPostProcessors(beanFactory);
// 初始化MessageSource
initMessageSource();
// 初始化事件派发器
initApplicationEventMulticaster();
// 是一个空方法,留给容器的子类实现,子类重写这个方法,在容器刷新的时候可以自定义一些逻辑
onRefresh();
// 注册事件驱动
registerListeners();
//初始化所有剩下的单实例bean
finishBeanFactoryInitialization(beanFactory);
// 完成BeanFactory的初始化创建工作,IOC容器就创建完成
finishRefresh();
}
二.分析
1、prepareRefresh()刷新前的预处理
1)、initPropertySources()自定义初始化一些属性设置,比如子类(继承AnnotationConfigApplicationContext)自定义的个性化的属性设置方法
2)、getEnvironment().validateRequiredProperties():检验属性的合法等
2、obtainFreshBeanFactory()获取BeanFactory
1)、refreshBeanFactory()创建BeanFactory实例
* 创建了一个beanFactory:
DefaultListableBeanFactory beanFactory = createBeanFactory();
synchronized (this.beanFactoryMonitor) {
this.beanFactory = beanFactory;
}
* 设置序列化id:beanFactory.setSerializationId(getId());
* 定制BeanFactory,在基本容器的基础上,增加了是否允许覆盖,是否允许扩展的设置,并提供了注解@Qualifier和 @Autowired的支持: customizeBeanFactory(beanFactory);
* 进行XML文件读取及解析。在这里将xml文件中的Bean对象解析为BeanDefinition类中的属性:
loadBeanDefinitions(beanFactory);
2)、getBeanFactory()获取刚才在AbstractRefreshableApplicationContext中创建的BeanFactory对象
3)、将创建的BeanFactory【DefaultListableBeanFactory】返回
3、prepareBeanFactory(beanFactory);BeanFactory的预准备工作(BeanFactory进行一些设置)
1)、设置BeanFactory的类加载器、支持表达式解析器等等
2)、添加部分BeanPostProcessor,比如ApplicationContextAwareProcessor
3)、设置忽略的自动装配的接口,比如EnvironmentAware、EmbeddedValueResolverAware等等
4)、注册可以解析的自动装配,我们能直接在任何组件中自动注入这些Spring为我们提供的组建,比如:
BeanFactory、ResourceLoader、ApplicationEventPublisher、ApplicationContext
5)、添加BeanPostProcessor,类型为ApplicationListenerDetector
6)、添加编译时的AspectJ
7)、给BeanFactory中注册一些能用的组件,比如:
id为environment,类型为ConfigurableEnvironment
id为systemProperties,类型为Map<String, Object>
id为systemEnvironment,类型为Map<String, Object>
4、postProcessBeanFactory(beanFactory);BeanFactory准备工作完成后进行的后置处理工作,子类通过重写这个方法来在BeanFactory创建并预准备完成以后做进一步的设置
5、 invokeBeanFactoryPostProcessors(beanFactory);执行BeanFactoryPostProcessor的后置处理方法
BeanFactoryPostProcessor:BeanFactory的后置处理器,在BeanFactory标准初始化之后执行的两个接口:BeanFactoryPostProcessor、BeanDefinitionRegistryPostProcessor
1)、先执行BeanDefinitionRegistryPostProcessor实现类的后置处理方法
2)、再执行BeanFactoryPostProcessor的后置处理方法
6、registerBeanPostProcessors(beanFactory);注册BeanPostProcessor(Bean的后置处理器,拦截bean的创建过程):
beanFactory.addBeanPostProcessor(postProcessor);
注册一个ApplicationListenerDetector,来在Bean创建完成后检查是否是ApplicationListener,如果是则先将其保存在容器中:
applicationContext.addApplicationListener((ApplicationListener<?>) bean);
7、initMessageSource();初始化MessageSource组件(SpringMvc中做国际化功能;消息绑定,消息解析)
8、initApplicationEventMulticaster();初始化事件派发器
9、registerListeners();在容器中注册所有的ApplicationListener
1)、从容器中拿到第三步是注册到容器中的所有的ApplicationListener
2)、将每个监听器添加到事件派发器中:
getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);
3)、派发之前步骤产生的事件
10.finishBeanFactoryInitialization(beanFactory);初始化所有剩下的单实例bean、
11.finishRefresh();完成BeanFactory的初始化创建工作,IOC容器就创建完成
1)、initLifecycleProcessor();初始化和生命周期有关的后置处理器,默认从容器中找是否有lifecycleProcessor的组件 LifecycleProcessor,如果没有则: new DefaultLifecycleProcessor();并将其加入到容器,后续可以从容器中获取该bean并将其注入到其他组件中
2)、getLifecycleProcessor().onRefresh();
拿到前面定义的生命周期处理器(BeanFactory);回调onRefresh();
3)、publishEvent(new ContextRefreshedEvent(this));发布容器刷新完成事件
4)、liveBeansView.registerApplicationContext(this);