1. spring ioc的启动过程:
spring IOC 容器的启动步骤可总结如下:
1 初始化 ApplicationContext
环境属性的初始化和验证,启动时间记录和相关标记设置,应用事件和监听者的初始化。
2 准备好容器中的 BeanDefinition (eager-initializing beans)
对 BeanDefinition 的解析、扫描和注册,BeanDefinition 的扫描和注册大致可以分为 XML 和注解两种,两种方式各自使用的组件有所不同,该步骤的时间也可以在最前面。
3 初始化 BeanFactory
准备好 BeanFactory 以供 ApplicationContext 进行使用,对接下来将要使用到的 Bean 进行实例化,资源进行准备,属性进行设置。
4 注册 BeanPostProcessors
BeanPostProcessors 是进行扩展的关键组件,需要在该步骤中进行注册,可分为两种类型: 一种是框架使用者提供的,用于特定业务功能的,另一种是框架开发者提供的,用于扩展框架功能。
5 调用 BeanDefinitionRegistryPostProcessor
BeanDefinitionRegistryPostProcessor 是一种功能增强,可以在这个步骤添加新的 BeanDefinition 到 BeanFactory 中。
6 调用 BeanFactoryPostProcessor
BeanFactoryPostProcessor 是一种功能增强,可以在这个步骤对已经完成初始化的 BeanFactory 进行属性覆盖,或是修改已经注册到 BeanFactory 的 BeanDefinition。
7 初始化 MessageSource 和 ApplicationEventMulticaster
MessageSource 用于处理国际化资源,ApplicationEventMulticaster 是应用事件广播器,用于分发应用事件给监听者。
8 初始化其他 Bean 和进行其他的的上下文初始化
主要用于扩展
9 注册 ApplicationListene
将 ApplicationListene 注册到 BeanFactory 中,以便后续的事件分发
10 实例化剩余的 Bean 单例
步骤 4 到 9 都对一些特殊的 Bean 进行了实例化,这里需要对所有剩余的单例 Bean 进行实例化
11 启动完成
资源回收,分发"刷新完成"事件
2. spring获取和实例化bean的过程:
Spring是通过递归的方式获取目标bean及其所依赖的bean的;
Spring实例化一个bean的时候,是分两步进行的,首先实例化目标bean,然后为其注入属性。
结合这两点,也就是说,Spring在实例化一个bean的时候,是首先递归的实例化其所依赖的所有bean,直到某个bean没有依赖其他bean,此时就会将该实例返回,然后反递归的将获取到的bean设置为各个上层bean的属性的。
3.