refresh 12 个步骤
1. prepareRefresh
创建和准备Environment对象
- Environment的作用之一是为后续@Value,值注入时提供键值
Environment对象的作用:解析键值
QualifierAnnotationAutowireCandiateResolver类成员方法getSuggestedValue用于获取对应key的Object类value
(无法解析其中的$和#等占位符)
使用StandardEnvironment类对象的成员方法resolvePlaceholders()来解析$占位符
解析properties中自定义的值需要使用getPropertySources().addLast方法
解析既有$又有#的值时,先解析$,再使用evaluate方法解析#
2. obtainFreshBeanFactory
这一步获取(或创建)BeanFactory
- BeanFactory的作用是负责bean的创建,依赖注入和初始化
- BeanDefinition作为bean的设计蓝图,规定了bean的特征,如单例多例,依赖关系,初始销毁方法等
- BeanDefinition的来源有多种多样,可以是通过xml获得,通过配置类获得,通过组件扫描获得,也可以编程添加
- 注:BeanFactory本是Application Context的父类,在此处为组合关系,后者使用了前者创建实例等功能
BeanDefinition的来源
1) 从xml获取
2)编程添加及从配置类获取
如上图,通过registerBeanDefinition方法以编程的方式添加了"Config1"作为BeanDefinition。使用postProcessor方法将Config1中@Bean注解标注的类添加为BeanDefinition
3) 扫描获取
3. prepareBeanFactory
这一步会完善BeanFactory,包括解析SpEL,类型转换器,特殊Bean注入等
- StandardBeanExpressionResolver来解析SpEL
- ResourceEditorRegistrar会注释类型转换器,并引用ApplicationContext提供的Environment完成${}解析
- 特殊的bean指beanFactory以及ApplicationContext,通过registerResolvableDependency来注册他们
- ApplicationContextAwareProcessor用来解析Aware接口
4.postProcessBeanFactory
这一步是空的,留给子类来扩展
- 一般Web环境的ApplicationContext都要利用它注册新的Scope,完善Web下的BeanFactory
- 体现的是模板方法设计模式
5. invokeBeanFactoryPostProcessors
beanFactory后处理器,充当beanFactory的扩展点,可以用来补充或修改BeanDefinition
- ConfigurationClassPostProcessor用于解析@Configuration,@Bean,@Import,@PropertySource等
- PropertySourcesPlaceHolderConfigurer-替换BeanDefinition中的${}
6. registerBeanPostProcessors
bean后处理器,充当bean的扩展点,可以工作在bean的实例化,依赖注入,初始化阶段
- AutowiredAnnotationBeanPostProcessor 功能有:解析 @Autowired @Value注解
- CommonAnnotationBeanPostProcessor 功能有:解析@Resource,@PostConstruct,@PreDestroy
- AnnotationAwareAspectJAutoProxyCreate 功能有:为符合切点目标 bean 自动创建代理
注:在注册BeanDefinition时添加对应的bean后置处理器,之后Bean Factory会注册这些后置处理器(BeanPostProcessor)
7. initMessageSource
实现国际化
- 看beanDefinitionMap中有没有名为messageSource的bean,如果没有,则提供空的MessageSource实现
8. initApplicationEventMulticaster
用来发布时间给监听器
- 可以从容器(BeanDefinitionMap)中找到名为applicationEventMulticaster的bean作为事件广播器,若没有,也会新建默认的事件广播器
- 可以调用ApplicationContext.publishEvent(事件对象)来发布事件
9. onRefresh
这一步是空实现,留给子类扩展
- SpringBoot中的子类可以在这里准备WebServer,即内嵌web容器
- 体现的是模板方法设计模式
10. registerListeners
用来接受事件
- 一部分监听器是事先编程添加的,另一部分监听器来自容器中的bean,还有一部分来自于@EventListener解析
- 实现ApplicationListener接口,重写其中onApplicationEvent(E e)方法即可
11. finishBeanFactoryInitialization
- conversionService也是一套转换机制,作为对PropertyEditor的补充
- 内前置解析器用来解析@Value中的${},借用的是Environment的功能
- 单例池用来缓存所有单例对象,对象的创建都分三个阶段,每一个阶段都有不同的bean后处理器参与进来,扩展功能
注:BeanFactory会先对容器中采取非延迟单例的类创建实例
12. finishRefresh
用来控制容器内需要生命周期管理的bean
- 如果容器中有名称为lifecycleProcessor的bean就用它,否则创建默认的生命周期管理器
- 调用context的start,即可触发所有实现LifeCycle接口bean的start
- 调用context的stop,即可触发所有实现LifeCycle接口bean的stop
部分内容转自b站黑马程序员视频:https://www.bilibili.com/video/BV15b4y117RJ?p=136