spring refresh
概述
refresh是一个方法,spring中所有的ApplicationContext容器都需要通过refresh方法初始化;
处理步骤
其中refresh方法包含12个主要的处理步骤:
1、第1个步骤做前置准备
2、第2~6步骤创建BeanFactory(ApplicationContext核心功能由BeanFactory完成)
3、第7~12准备ApplicationContext,其中11步创建初始化容器中的单例bean;
1、prepareRefresh
这个过程创建准备Environment对象
Environment对象存储了java和系统的一些键值信息;
最重要的是存储我们自定义配置的application.properties;
总结
- 作用之一是为后续@value,值注入提供键值
测试
解析@value注解配置的值
2、obtainFreshBeanFactory
- 这一步创建或者获取BeanFactory
- BeanFactory虽然和ApplicationContext是继承关系,但是一般是配合使用的,ApplicationContext对负责bean创建,依赖注入和初始化仍然是直接调用的BeanFactory的方法;
- BeanDefinition规定了bean的特征,如单例多例,依赖关系
- BeanDefinition可以通过xml及配置类获得,也可通过组件扫描获得;
BeanFactory通过BeanDefinition收集信息后创建bean
测试
我们可以看到beandefinition初始为空;
我们接着在xml中配置bean
可以看到beandifinition已经不为空;
也可通过配置类配置bean
也可以看到bean被注入了进来;
3、prepareBeanFactory
- 完善BeanFactory
- 了解谁来解析${ },应用ApplicationContext提供的Environment解析
- 特殊bean的注入,BeanFactory,ApplicationContext
4、postProcessBeanFactory
-
这一步是空实现,留给子类扩展
-
模板方法的设计模式
5、invokeBeanFactoryPostProcessors
beanFactory的后处理器,充当BeanFactory扩展点;
可以用来补充修改BeanDefinition;
ConfigurationClasProcessor解析@Configuration @Bean import等补充到bean的map中;
6、registerBeanPostProcessors
加入更多的后处理器;
这一步只是注册,后续步骤才会使用;
7、initMessageSource
实现国际化;
容器中有messageSource,如果没有在map中找到,会自动创建;
8、initApplicationEventmulicaster
事件广播器,发送事件给监听器;
通过ApplicationContext的publishEvent(事件对象)来发布;
9、onRefresh
空实现,留给子类;
springboot中的子类在这准备webserver,即内嵌web容器;
10、RegisterListeners
initApplicationEventmulicaster管理发送监听事件,这里管理接收事件;
需要实现ApplicationListerer,重写相关方法;
11、finishBeanFactoryInitialization
- singletonObject单例池
- embeddevalueresolves内嵌解析器,解析${ };
- conversionService做类型转换
12finishRefresh
- lifecycleProcessor生命周期处理器,控制容器内生命周期的管理;
- 调用context.start可以触发所有实现lifecycle接口bean的start方法;