3.实例化建BeanDefinition读取器: AnnotatedBeanDefinitionReader
其主要做了2件事情 1.注册内置BeanPostProcessor 2.注册相关的BeanDefinition
4.创建BeanDefinition扫描器:ClassPathBeanDefinitionScanner
可以根据配置类扫描到所有的Bean。<br><br>此处scanner实例不作为配置类中的扫描实例,此实例是给单独提供给applicationContext去扫描包的
5.注册配置类为BeanDefinition. register(annotatedClasses)
将配置类注册到BeanDefinitionMap中。
6.refresh()<br>
ApplicationContext 的 refresh() : <b>整个IOC容器初始化的核心</b>
// 1.刷新预处理,和主流程关系不大,就是保存了容器的启动时间,启动标志等<br>prepareRefresh();
// <b>初始化属性配置</b><br>initPropertySources();
initPropertySources() 在<b>基于web<br>环境的ApplicationContext</b>子类中有重写<br>
// 2. 获取BeanFactory,<b>加载所有bean的定义信息(未实例化) ---BeanDefinition获取</b><br>ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
在步骤中,会进行 <b>xml配置文件</b>、<b>声明式注解</b>、<br>以及<b>编程式 </b>的解析 以<b>获取BeanDefinition</b>
其余点: 基于<b>xml配置文件的ApplicationContext可重复刷新</b>,<br>基于<b>注解类的ApplicationContext只能刷新一次</b>
// 3. BeanFactory的预处理配置<br>prepareBeanFactory(beanFactory);
1、<b>给BeanFactory中设置 类加载器,表达式解析器</b>
2、编码注册<b>ApplicationContextAwareProcessor</b>。<br>(该类为BeanPostProcessor的实现类,其中主要是<b>处理</b><br><b>几个 Aware 接口的回调,</b>这几个接口会被BeanFactory<br>直接忽略<b>)</b><br>
3、有<b>几个类型</b> 直接注入绑定在 beanFactory中
在 BeanFactory 再遇到特定类型(就这几个)的属性注入时,会直接从这几个绑定值<br>的 Map 中找出对应的值,直接注入进去<br>
4、<b>注册监听器钩子</b>
5、<b>为 AOP做准备</b>
6、注册<b>默认的运行时环境Enviroment</b>
// 4. 准备BeanFactory完成后进行的后置处理--这是一个空方法<br>postProcessBeanFactory(beanFactory);
一般由<b>子类实现</b>(在<b>Web环境下的<br>ApplicationContext子类</b>中就有该实现)<br>
// 5. 执行BeanFactory创建后的后置处理器<br>invokeBeanFactoryPostProcessors(beanFactory);
执行<b>BeanFacotryPostProcessor</b><br>(注意,其中还顺带有<b>BeanDefinitionRegistryPostProcessor</b>[最先]<br>的执行) <br>
// 6. 注册Bean的后置处理器<br>registerBeanPostProcessors(beanFactory);
初始化BeanPostProcessor<br>(<b>将BeanPostProcessor 放入到<br>BeanFactory中</b>) --因为该类型PostProcessor<br>是 对 实例化后的bean使用的,肯定不能像上面一样<br>在这个地方就直接执行..
// 7. 初始化MessageSource<br>initMessageSource();<br>--<b>国际化组件</b>
// 8. 初始化 事件派发器<br>initApplicationEventMulticaster();
构造一个 SimpleApplicationEventMulticaster<br>并放入 BeanFactory中而已
// 9. 子类的多态onRefresh<br><b>onRefresh(); -- 重要扩展点</b><br>
无论是SpringMVC还是SpringBoot都在此处有自己的扩展
// 10. 注册监听器<br>registerListeners();
1、注册所有<b>已经被创建出来的ApplicationListener</b>,绑定到<br>ApplicationEventMulticaster中<br>
2、对于<b>没有被实例化的ApplicationListener</b>,只是先<br>绑定其beanName 到 事件派发器中
3、<b>广播早期事件</b>
// 11. 初始化所有剩下的单例Bean<br>finishBeanFactoryInitialization(beanFactory);
<b>一个一个的</b>循环<b>初始化那些 非延迟加载的 单实例 (非抽象)bean</b>
<b>// 12. 完成容器的创建工作<br>finishRefresh();</b>
初始化LifeCycleProcessor,<br>并将refresh的动作传播到生命周期<br>处理器(其实 就是<b>调用 实现lifeCycle接口的<br>类的 start()方法</b>)<br>
广播 <b>ContextRefreshEvent</b>事件
// 13. 清除缓存<br>resetCommonCaches();
清除前面使用到的各种乱七八糟<br>的后面不需要再使用的缓存
<b>切入点</b>