spring源码之refresh方法流程解析
refresh方法:
1、为IOC容器以及Bean的生命周期管理提供条件。
2、刷新Spring上下文信息,定义Spring上下文加载流程。其中ConfigurationClassParser解析各种标签比如@Bean
阅读源码:
this.prepareRefresh();
1.设置spring容器的启动时间
2.撤销关闭状态
3.开启活跃状态
4.初始化属性元信息initPropertySource()
5.验证环境中必须存在的属性
ConfigurableListableBeanFactory beanFactory = this.obtainFreshBeanFactory();
获取BeanFactory实例
this.prepareBeanFactory(beanFactory);
对BeanFactory进行相关的设置,为后续的使用做准备
1.设置ClassLoader用来加载Bean
2.设置表达式解析器等等
this.postProcessBeanFactory(beanFactory);
模板方法,让不同的spring容器自定义扩展自己的加载方法,方法体为空
this.invokeBeanFactoryPostProcessors(beanFactory);
(会跳转到ConfigurationClassParser.doProcessConfigurationClass解析各种标签比如@Bean等)
调用工厂后处理器处理解析各类Bean标签(@Configuration/@Import/@Bean/@SpringbootApplication),扫描Bean文件,并解析成一个个的Bean,这里的Bean只是被加载到spring容器当中,由于spring容器的懒加载,这些Bean仅仅只是加载到容器,并没有连接和初始化,当程序需要使用到该Bean的时候,才会将bean连接和初始化。
this.registerBeanPostProcessors(beanFactory);
在容器中找出实现BeanPostProcessors接口的bean,设置到BeanFactory的属性之中,最后bean被实例化的时候会调用BeanPostProcessors(bean的后置处理器),
this.initMessageSource();
加载国际化信息
this.initApplicationEventMulticaster();
初始化事件的广播器,用于事件的发布
this.onRefresh();
模板方法:让不同的spring容器自定义扩展自己的加载方法,方法体为空
this.registerListeners();
注册监听器
this.finishBeanFactoryInitialization(beanFactory);
实例化BeanFactory中已经被注册但是没有实例化的所有bean(懒加载不需要被实例化)
this.finishRefresh();
初始化生命周期处理器等相关的事情