spring容器启动
1、设置配置文件地址,子类调用继承方法、将地址封装在AbstractRefreshableConfigApplicationContext 类中,
2、容器刷新开始
3、为上下文刷新做准备、设置系统变量、初始化earlyApplicationListeners
bean工厂创建,bean的解析和注册
4、创建bean工厂,调用子类AbstractRefreshableApplicationContext 的 方法进行工厂创建和初始化
5、工厂创建、默认创建默认工厂DefaultListableBeanFactory
6、设置工厂唯一ID,定制bean工厂是否允许BeanDefinition覆盖, 是否允许循环引用
7、解析注册bean
8、初始化文件读取类 XmlBeanDefinitionReader,设置上下文环境和配置资源加载器
9、reader 通过文件地址读取对应的资源
10、将路径资源封装成Resource[] 格式,
11、将资源格式封装为 InputSource 类,并设置字节编码
12、将资源解析为文档格式 Document 类
13、开始注册bean
14、创建一个默认的文档读取 BeanDefinitionDocumentReader 类,用于读取文档格式的资源
15、获取真正的文档解析器 BeanDefinitionParserDelegate类
16、初始化BeanDefinitionParserDelegate类,讲读取器的资源封装到这个类中,将文档的属性封装到DocumentDefaultsDefinition类中,例如懒加载,自动装配等
17、解析bean前后有两个方法用户处理文档类
18、解析对应的标签,import, alias,bean, beans 将相关属性封装成对应的类 并注册到容器中
19、通过文档获取对应的元素解析器,例如普通的解析器,scan扫描解析器,进行bean的注册
20、封装BeanDefinitionHolder 转换为 BeanDefinition注册到容器
bean工厂功能扩展
21、设置默认资源、设置ApplicationContextAwareProcessor前后置处理器,调用对应的方法对实现了Aware接口的bean设置对应的系统变量,供用户使用
22、设置忽略自动装配的类,当实现该接口时忽略自动装配、一般为系统类
23、设置系统依赖接口自动装配的真正实现类
24、设置ApplicationListenerDetector前后置处理器,用于处理容器中实现事件监听器接口的类,并保存在上下文中AbstractApplicationContext类,
25、设置上线文通知LoadTimeWeaverAwareProcessor处理器,用户获取上下文的通知
26、Register default environment beans
27、postProcessBeanFactory,设置servelt对应的处理器
28、解析并注册(放置再处理器列表里)实现BeanPostProcessors接口的类,
29、initMessageSource,初始化消息资源
30、初始化事件发布器initApplicationEventMulticaster,可以自定义,没有就使用默认
31、注册监听器registerListeners,将用户实现的监听器注册到bean工厂的上下文中
32、实例化实现LoadTimeWeaverAware接口的类,以及提前处理并初始化单例bean
33、初始化实现LifecycleProcessor接口的类,用于处理对应的逻辑
34、调用LifecycleProcessor 的 onRefresh()方法
35、发布上下文刷新事件ContextRefreshedEvent类