Spring初始化全过程
2021-02-19 19:11:42 45 举报
AI智能生成
spring 初始化
作者其他创作
大纲/内容
0.容器刷新 AnnotationConfigApplicationContext#refresh()
1.创建 BeanFactory
1.1) 创建的是 DefaultListableBeanFactory 对象
1.2) 用父类 ConfigurableListableBeanFactory 接收
2.准备 BeanFactory
2.1)设置表达式解析器,解析 #{}
2.2)添加处理器 ApplicationContextAwareProcessor
2.3)添加处理器 ApplicationListenerDetector 用于检测ApplicationListeners
2.4)注册默认的环境对象,这里是将环境对象直接保存到单例容器中了
3.BeanFactory 的后置处理
该方法留给子类重写,当前容器没有重写
4.调用 BeanFactory 的后置处理器
4.1) 先从 bean 定义容器中 获取 BeanDefinitionRegistryPostProcessor 类型的处理器
4.1.1) 先查找实现了 PriorityOrdered 接口的处理器
4.1.2) 调用 BeanFactory 的 getBean()方法,创建对象,注意:此时会创建该类型处理器的对象
4.1.3)对实现了 PriorityOrdered 接口的处理器进行排序
4.1.4)遍历上述的所有处理器,调用 postProcessBeanDefinitionRegistry 方法
。。。。。 同理在 查找 实现了 Ordered 接口的处理器,执行上述步骤
。。。。。同理在查找 没有实现任何接口的 处理器,执行上述步骤
4.1.7)遍历‘所有’的处理器(不区分是否实现接口),调用 postProcessBeanFactory 方法;调用这个方法是因为 BeanDefinitionRegistryPostProcessor 接口实现了 BeanFactoryPostProcessor 接口
4.2)再从 bean 定义容器中 获取 BeanFactoryPostProcessor 类型的处理器
4.2.1)先 查找 实现了 PriorityOrdered 接口的处理器
4.2.2)如果符合条件,则调用 BeanFactory 的 getBean() 方法,创建对象!注意:这里会创建 BeanFactoryPostProcessor 类型的对象
4.2.3)对实现了 PriorityOrdered 接口的处理器进行排序
4.2.4)遍历所有的 BeanFactoryPostProcessor 处理器,调用 postProcessBeanFactory 方法
。。。。。 同理,查找实现了 Ordered 接口的处理器,执行上述步骤
。。。。。 同理,查找没有实现任何接口的处理器,执行上述步骤
5.注册 Bean的后置处理器
5.1)从 bean 定义容器中 获取类型为 BeanPostProcessor 的所有bean的名字
5.2)循环判断,如果当前处理器实现了 PriorityOrdered 接口,则放到A集合中,实现了 Ordered 接口的放到 B集合中,没有实现任何接口的放到 C 集合中
5.3)优先处理A集合,调用 BeanFactory 的 getBean()方法,去创建对象!! 将创建好的处理器对象,保存到 BeanFactory 中
5.4)同理在处理B集合和C集合
6.初始化 MessageSource 组件
6.1)看 BeanFactory 中是否包含名字为 messageSource 的bean
6.2)如果包含,则获取该对象
6.3)如果不包含,则创建 DelegatingMessageSource 对象,保存到 DefaultSingletonBeanRegistry 的单例容器对象中
7.初始化事件派发器
7.1) 看 BeanFactory 中是否包含名字为 applicationEventMulticaster 的bean
7.2)如果包含,则从容器中获取该对象,并赋值给属性 applicationEventMulticaster
7.3)如果不包含,则创建 SimpleApplicationEventMulticaster 对象,并包含到 DefaultSingletonBeanRegistry单例容器对象中
8. onRefresh()
留给子容器,比如springboot 的 ServletWebServerApplicationContext 容器就重写了此方法,用于创建tomcat容器
9.注册监听器
9.1)遍历所有的监听器,如果集合不为空集合,则获取第7步中的事件派发器对象,将监听器设置进去。不过这一步对于spring来说,应该都是空集合,没有创建过任何的监听器,除非我在此之前手动创建。而对于springboot 它可以从类路径下的 METF-INF/spring.factories 文件中获取
9.2)从 bean 定义容器中 获取类型为 ApplicationListener 的所有bean的名字,将 bean的名字一一设置到第7步中的事件派发器中
9.3)获取早期的事件,将其发布(调用发布方法,用户开始感知)。这个早期事件就是创建 BeanFactory 之前的一步流程
10.实例化剩余的所有单实例非懒加载的 Bean
说明:前面对于实现了 BeanDefinitionRegistryPostProcessor 或者 BeanFactoryPostProcessor 的类已经创建了对象,对于普通的 bean, 比如 @Component 注解标注的 一个没有实现任何接口的 Person 类,此时就在这里开始创建对象
10.1)获取所有的 bean 定义信息; ConfigurationClassPostProcessor 处理器在第4步工作时,根据 @ComponentScan 和 @Component ,@Bean , @Import 将这些类统统保存到 bean 定义容器中
10.2)创建 bean实例。AbstractAutowireCapableBeanFactory#createBeanInstance()
获取所有的处理器,如果为 SmartInstantiationAwareBeanPostProcessor 类型,则调用 determineCandidateConstructors 方法,获取构造器;比如 AutowiredAnnotationBeanPostProcessor 处理器此时就会在这里工作
10.3) 调用 applyMergedBeanDefinitionPostProcessors 方法,调用所有 MergedBeanDefinitionPostProcessor 处理器的postProcessMergedBeanDefinition方法
实例创建完成之后,调用这个类型的处理器;/其中 CommonAnnotationBeanPostProcessor 这个处理器,会在这里解析 Resource 注解的元数据,放到缓存中,留着后面用;同样AutowiredAnnotationBeanPostProcessor 也会在这里生效,解析 Autowired 注解信息,放到缓存中
10.4)属性赋值。AbstractAutowireCapableBeanFactory#populateBean()
10.4.1)获取所有的处理器,如果为 InstantiationAwareBeanPostProcessor类型,则调用 postProcessAfterInstantiation 方法;方法名顾名思义就是 实例化之后处理
10.4.2)获取所有的处理器,如果为 InstantiationAwareBeanPostProcessor 类型,则调用 postProcessProperties 方法。比如解析 @Resource 注解的 CommonAnnotationBeanPostProcessor 处理器此时会工作,将 @Resource 标注的属性进行赋值;同样的,AutowiredAnnotationBeanPostProcessor 也会工作,将 @Autowired 注解标注的属性进行赋值
10.4.3)获取所有的处理器,如果为 InstantiationAwareBeanPostProcessor 类型,则调用 postProcessPropertyValues 方法
10.5)初始化u。AbstractAutowireCapableBeanFactory#initializeBean()
10.5.1)调用 aware 方法,比如实现了 BeanFactoryAware 接口
10.5.2)调用 applyBeanPostProcessorsBeforeInitialization 方法,初始化之前,先调用所有处理器的 postProcessBeforeInitialization 方法;注意:这里有一个处理器:InitDestroyAnnotationBeanPostProcessor 他此时会工作,此时就解析注解@PostConstruct标注的初始化方法, 所以所有形式的初始化方法中,这个最先执行
10.5.3)调用初始化方法,比如实现了 InitializingBean 接口,或者指定了 init 方法
10.5.4)调用 applyBeanPostProcessorsAfterInitialization 方法,初始化完成之后,调用所有处理器的 applyBeanPostProcessorsAfterInitialization 方法
11.刷新完成
11.1)初始化生命周期处理器
11.2)调用生命周期对象的 onRefresh()方法
11.3)发布容器刷新完成事件 ContextRefreshedEvent
0 条评论
下一页