根据B站黑马视频总结
1. refresh的12个步骤
- prepareRefresh
- obtainFreshBeanFactory
- prepareBeanFactory
- postProcessBeanFactory
- invokeBeanFactoryPostProcessors
- registerBeanPostProcessors
- initMessageSource
- initApplicationEventMulticaster
- onRefresh
- registerListeners
- finishBeanFactoryInitialization
- finishRefresh
- 步骤2-6是创建并准备beanFactory对象
- 步骤7-12是完善applicationContext的其他功能
- 步骤11是创建非懒加载的单例对象
1.1 prepareRefresh
- 准备上下文环境
- 创建了一个Environment对象
- systemProperties:保存Java环境变量的键值
- systemEnvironment:保存了系统环境变量的键值
- 自定义properSource:保存了配置文件中的键值
1.2 obtainFreshBeanFactory
- 创建BeanFactory,它也是作为ApplicationContext的一个成员变量(其实ApplicationContext也继承了BeanFactory)
- 为beanFactory中的成员变量beanDefinitionMap(是个容器)进行初始化,该map的作用是保存BeanDefinition对象
- BeanDefinition作为bean的设计蓝图,规定了bean的特征,如单例、依赖关系、初始销毁方法
1.3 prepareBeanFactory
- 进一步完善beanFactory。为它的其他各项成员变量赋值
- beanExpressionResolver:用来解析SpEL。
- propertyEditorRegisters:类型转换器
- 它在这里使用了ResourceEditorRegister实现类
- 并应用ApplicationContext提供的Environment完成${}解析
- registerResolvableDependency:是个容器,用于管理一些特殊的bean。如注册beanFactory以及ApplicationContext。让这些对象也能用于依赖注入。
- beanPostProcessors:是个容器,用于管理bean后置处理器,bean的后置处理器会在bean的生命周期的各个阶段进行工作。此处会自动给我们添加两个bean后置处理器
- ApplicationContextAwareProcessor:用来解析Aware接口
- ApplicationListenerDetector:用于识别容器中ApplicationListener类型的bean
- 单例池中也会添加一些基本的单实例bean(environment,systemProperties等)
1.4 postProcessBeanFactory
- 是一个空实现,留给子类扩展。这里体现了模板方法设计模式
- 如在web环境的ApplicationContext重写该方法来实现注册新的Scope,完善web下的BeanFactory
1.5 invokeBeanFactoryPostProcessors
- 这一步会调用所有的beanFactory后置处理器。
- beanfactory后置处理器作用是充当beanFactory的扩展点,可以添加或修改BeanDefinition
- 我们可以自定义beanFactory后置处理器,只要实现BeanFactoryPostProcessor接口即可。当容器刷新执行到这个步骤会自动调用我们实现的接口方法。
- 常见的beanFactory后置处理器有
- ConfigurationClassPostProcessor:解析@Configuration,@Bean,@Import,@PropertySource,并向beanDefinitionMap中添加相应的beanDefinition对象(补充:这个需要优先执行,而且还是系统自动帮我们创建的。因为其他beanFactory后置处理器比如我们自定义的beanFactory后置处理器是需要先解析生成对应的BeanDefinition对象信息,然后才能生成bean对象(如果需要还会将这个bean放入单例池中)执行,而生成对应的beanDefinition对象信息就需要借助ConfigurationClassPostProcessor来实现)
- MapperScannerConfigurer:向beanDefinitionMap中添加Mapper接口对应的BeanDefinition对象。
1.6 registerBeanPostProcessors
- 继续从beanDefinitionMap中找出所有的bean后置处理器,生成实例对象并保存到beanPostProcessors集合中
- beanPostProcessor:bean的后置处理器,充当bean的扩展点,它们会工作在bean的实例化、依赖注入、初始化阶段前后。常见的bean后置处理器有
- AutowiredAnnotationBeanPostProcessor:解析@Autowired,@Value注解
- CommonAnnotationBeanPostProcessor:解析 @Resource,@PostConstruct,@PreDestroy
- AnnotationAwareAspectJAutoProxyCreator:为符合切点的目标bean自动创建代理
1.7 initMessageSource
- 向ApplicationContext添加messageSource成员,实现国际化功能
- 在beanDefinitionMap中找名为messageSource的bean定义信息,如果没有,则提供一个空的MessageSource实现(会将这个空实现bean放入单例池中)
1.8 initApplicationContextEventMulticaster
- 向ApplicationContext的成员变量applicationEventMulticaster赋值(初始化)
- applicationEventMulticaster是一个事件广播器,它里面维护了一个集合,该集合保存了spring容器的所有监听器。
- 如果需用用事件广播器发生事件,则事件广播器就会遍历它所维护的集合,然后给相应的监听器发送事件。
- 查找beanDefinitionMap中是否有名为applicationEventMulticaster的beanDefinition信息,若没有,则会创建一个默认的事件广播器(也会将这个bean放入单例池中),用来发布事件。
1.9 onRefresh
- 这一步也是一个空实现,留给子类扩展。模板方法模式
- 如springboot中的子类在这里准备了WebServer(内嵌web容器)
1.10 registerListeners
- 从多种途径中找到事件监听器对象,并添加到applicationEventMulticaster维护的集合当中
- 事件监听器对象的来源
- 实现编程添加的
- 来自容器的bean(通过实现ApplicationListener接口,当然如果需要也会将这个bean放入单例池中)
- 来自@EventListener注解的解析(容器帮我们生成一个事件监听器对象)
1.11 finishBeanFactoryInitialization
- 这一步会将beanFactory的成员补充完毕。并且初始化剩下的所有的非懒加载单例bean
- conversionService:也是一套类型转换机制,是对propertyEditorRegistrars的补充。
- embeddedValueResolvers:内嵌值解析器。其实是对Environment的封装,用来解析@Value中的${}
- singletonObjects:继续向单例池中添加剩余的非懒加载的单例bean。重点
- 添加的过程中,beanPostProcessors中的bean后置处理器也会工作
1.12 finishRefresh
- 这一步会为ApplicationContext添加lifecycleProcessor成员。用来控制容器内需要生命周期管理的bean
- 去容器的单例池中寻找有没有名为lifecycleProcessor的bean就用它,如果没有则默认创建一个生命周期管理器(是spring容器的生命周期,也会加入单例池)
- 生命周期管理的意思:
- 当调用spring容器context的start方法。则触发所有实现LifeCycle接口bean的start方法
- 当调用spring容器context的stop方法。则触发所有实现LifeCycle接口bean的stop方法。
- 发布一个ContextRefreshed事件,表示整个refresh完成执行完成。
2. 总结
- prepareRefresh:准备好环境变量,配置变量
- obtainFreshBeanFactory:创建或获取bean工厂
- prepareBeanFactory:准备bean工厂
- postProcessBeanFactory:子类去扩展bean工厂
- invokeBeanFactoryPostProcessors:自定义beanFactory后置处理器去扩展bean工厂
- registerBeanPostProcessors:准备bean后置处理器
- initMessageSource:为spring容器提供国际化功能
- initApplicationEventMulticaster:为spring容器提供事件发布器
- onRefresh:留给子类对spring容器进行扩展
- registerListeners:为spring容器注册监听器
- finishBeanFactoryInitialization:初始化剩余的非懒加载单例bean,执行bean后置处理器扩展
- finishRefresh:准备spring容器生命周期管理器,发布contextRefreshed事件