7000字长文带你深入了解IOC启动原理( 二 )


2.2 实际工作流程
看过Spring源码或者听过的都知道里面有一个方法叫做refresh,他完成了好多事情 。当然他的行为也代表了整个IOC容器加载和实例化对象的过程 。第三章的代码解读中我们仔细看

7000字长文带你深入了解IOC启动原理

文章插图
 
执行过程:
  • 加载配置文件,初始化系统环境Environment接口
  • 准备上下文环境,初始化一些配置资源
  • 创建一个工厂
  • 为工厂添加各种环境
  • 获取子类自己重写的BeanFactoryPostProcessor
  • 执行容器和我们自己的BeanFactoryPostProcessor
  • 注册BeanPostProcessor
  • 国际化处理
  • 转播器
  • 子类初始化Bean
  • 注册监听器,观察者模式
  • 完成Bean创建
  • 发布相应的事件,监听器
3. IOC源码解读3.1 上下文配置启动
7000字长文带你深入了解IOC启动原理

文章插图
【7000字长文带你深入了解IOC启动原理】 
在创建ClassPathXmlApplicationContext的时候,构造方法中执行了这些方法 。
说白了,加载了一个解析配置文件路径的加载器;然后又通过系统环境变量拿到这个配置文件,进行一些配置文件的去空格,转换表达式等等操作(没有进行解析);最后就是那个被我标成红色东东,refresh方法中它完成了几乎所有的工作 。下面细聊
3.2 refresh
7000字长文带你深入了解IOC启动原理

文章插图
 
这个方法几乎完成了所有的操作,创建工厂,执行Processor等等,实例化对象,开启事件监听等等 。
接下来细聊
3.3.1 prepareRefresh()
这个方法的主要作用是为应用上下文的刷新做一些准备性的工作 。校验资源文件,设置启动时间和活跃状态等 。
3.3.2 obtainFreshBeanFactory()
7000字长文带你深入了解IOC启动原理

文章插图
 
可以get到,它主要就是创建了一个工厂BeanFactory,并且解析了配置文件,加载了Bean定义信息(面试的时候直接答这个点就够了,如果想说的可以将下面的bean信息加载聊聊)没错,标红的就是咱接下来细聊的点
7000字长文带你深入了解IOC启动原理

文章插图
 
这个就是加载配置文件的过程,注意:此时仍然没有解析,解析在标红的下面
7000字长文带你深入了解IOC启动原理

文章插图
 
这个就是读取的过程,具体解析流程来自parse中,这个直接调用了JAVA中的解析XML的类库,有兴趣自行翻阅,最后返回了一个Document对象 。
通过Document对象,读取内部的标签,执行不同的方法,逻辑和MyBatis中解析配置文件的思想相同,大家自行翻阅 。
此时所有的Bean定义信息都被保存到了BeanDefinitionRegistry接口,然后走子类DefaultListableBeanFactory工厂的注册方法
7000字长文带你深入了解IOC启动原理

文章插图
 
3.3.3 prepareBeanFactory(beanFactory)
为BeanFactory准备一些环境,方便在实例化的时候使用,同时添加容器自己的BeanPostProcessor
7000字长文带你深入了解IOC启动原理

文章插图
 
3.3.4 postProcessBeanFactory
留给子类扩展的BeanFactoryPostProcessor,
3.3.5 invokeBeanFactoryPostProcessors(beanFactory)
这个类,涉及到了两个接口 。
  • BeanFactoryPostProcessor
  • BeanDefinitionRegistryPostProcessor接口,这个接口是BeanFactoryPostProcessor的子接口,它的优先级比BeanFactoryPostProcessor更高
它的总体执行流程是:先执行BeanDefinitionRegistryPostProcessor的BeanFactoryPostProcessor,然后再执行BeanFactoryPostProcessor
下图是BeanDefinitionRegistryPostProcessor接口的处理过程
7000字长文带你深入了解IOC启动原理

文章插图
 
BeanFactoryPostProcessor的处理逻辑
总逻辑就是先分类,已经处理过的直接跳过,没有处理过的,分类处理,逻辑和上面的相同 。
3.3.6 registerBeanPostProcessors
这个方法的逻辑和上面的一样,只不过上面是直接执行了BeanFactoryPostProcessor,而这个仅仅注册没执行 。
7000字长文带你深入了解IOC启动原理

文章插图
 
首先拿到工厂中所有的BeanPostProcessor类型的Bean,然后分类处理,排序注册 。
3.3.7 initMessageSource()
执行国际化内容
3.3.8 initApplicationEventMulticaster


推荐阅读