Spring 系列目录(http://www.javashuo.com/article/p-kqecupyl-bm.html)html
1. Spring ApplicationContext(一)初始化过程
2. Spring ApplicationContext(二)环境准备
3. Spring ApplicationContext(三)BeanFactory 初始化
4. Spring ApplicationContext(四)BeanFactory 功能扩展
5. Spring ApplicationContext(五)BeanFactoryPostProcessor
6. Spring ApplicationContext(六)BeanPostProcessor
7. Spring ApplicationContext(七)Message 源
8. Spring ApplicationContext(八)事件监听机制
9. Spring ApplicationContext(九)初始化非延迟的 bean
10. Spring ApplicationContext(十)finishRefreshjava
咱们以 ClassPathXmlApplicationContext 做为切入点研究 ApplicationContext 的初始化过程。程序员
public ClassPathXmlApplicationContext(String configLocation) throws BeansException { this(new String[] {configLocation}, true, null); } public ClassPathXmlApplicationContext(String[] configLocations, boolean refresh, ApplicationContext parent) throws BeansException { // 1. 设置父容器 super(parent); // 2. 设置配置文件路径,调用 getEnvironment().resolveRequiredPlaceholders(path) 方法解析路径中的占位符 setConfigLocations(configLocations); // 3. 刷新容器,即从新初始化 bean 工厂 if (refresh) { refresh(); } }
下面咱们重点关注 refresh() 方法都做了那些事。spring
public void refresh() throws BeansException, IllegalStateException { synchronized (this.startupShutdownMonitor) { // 1. 刷新上下文环境 prepareRefresh(); // 2. 初始化 beanFactory,对配置文件进行解读 ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory(); // 3. 对 beanFactory 进行功能扩展 prepareBeanFactory(beanFactory); try { // 4. 专门留给子类做扩展用,这是一个空的方法 postProcessBeanFactory(beanFactory); // 5. 注册并执行 BeanFactoryPostProcessor 后置处理器 invokeBeanFactoryPostProcessors(beanFactory); // 6. 注册 BeanPostProcessor 后置处理器,在 getBean() 建立 bean 时调用 registerBeanPostProcessors(beanFactory); // 7. 初始化 Message 源,即不一样语言消息体,国际化处理 initMessageSource(); // 8. 注册多播器,事件监听器的管理者 initApplicationEventMulticaster(); // 9. 专门留给子类初始化其它 bean 用,这是一个空的方法 onRefresh(); // 10. 注册监听器 registerListeners(); // 11. 初始化剩余的 bean (部分在 invokeBeanFactoryPostProcessors 已经初始化) finishBeanFactoryInitialization(beanFactory); // 12. 完成刷新,通知生命周期处理器 LifecycleProcessor 刷新过程,同时发布 ContextRefreshedEvent 通知别人 finishRefresh(); } catch (BeansException ex) { destroyBeans(); cancelRefresh(ex); throw ex; } finally { resetCommonCaches(); } } }
下面归纳一下 ClassPathXmlApplicationContext 初始化的步骤,并从中解释一下它为咱们提供的功能。架构
(1) 初始化前的准备工做,例如对系统属性或者环境变量进行准备及验证。app
在某种状况下项目的使用须要读取某些系统变量,而这个变量的设置极可能会影响着系统的正确性,那么 ClassPathXmlApplicationContext 为咱们提供的这个准备函数就显得很是必要,它能够在 Spring 启动的时候提早对必须的变量进行存在性验证函数
(2) 初始化 BeanFactory,并进行 XML 文件读取。post
以前有提到 ClassPathXmlApplicationContext 包含着 BeanFactory 所提供的一切特征,那么在这一步骤中将会复用 BeanFactory 中的配置文件读取解析及其余功能,这一步以后,ClassPathXmlApplicationContext 实际上就已经包含了 BeanFactory 所提提供的功能,也就是能够进行 Bean 的提取等基础操做了。ui
(3) 对 BeanFactory 进行各类功能填充。this
@Qualifier 与 @Autowired 应该是你们很是熟悉的注解,那么这两个注解正是在这一步骤中增长的支持。
(4) 子类覆盖方法作额外的处理。
Spring 之因此强大,为世人所推崇,除了它功能上为你们提供了便例外,还有一方面是它的完美架构,开放式的架构让使用它的程序员很容易根据业务须要扩展已经存在的功能。这种开放式的设计在 Spring 中随处可见,例如在本例中就提供了一个空的函数实现 postProcessBeanFactory 来方便程序员在业务上作进一步扩展。
(5) 激活各类 BeanFactory 处理器。
(6) 注册拦截 bean 建立的 bean 处理器,这里只是注册,真正的调用是在 getbean 时候。
(7) 为上下文初始化 Message 源,即对不一样语言的消息体进行国际化处理。
(8) 初始化应用消息广播器,并放人 "applicationeventMulticaster" bean中。
(9) 留给子类来初始化其余的 bean。
(10) 在全部注册的 bean 中查找 listener bean,注册到消息广播器中。
(11) 初始化剩下的单实例(非惰性的)。
(12) 完成刷新过程,通知生命周期处理器 lifecycleProcessor 刷新过程,同时发出 ContextRefreshEvent 通知别人。
天天用心记录一点点。内容也许不重要,但习惯很重要!