系列文章目录
1.Springboot2启动过程源码分析-SpringApplication初始化
2.Springboot2启动过程源码分析-SpringApplication#run
3.Springboot2启动过程源码分析-prepareContext方法
4.Springboot2启动过程源码分析-refresh方法
5.Springboot2启动过程源码分析-Bean的实例化
6.Springboot2启动过程源码分析-总结
文章目录
前言
上一节,我们解读了prepareContext方法,本节我们来看下refreshContext,refreshContext内部只调用了AbstractApplicationContext的refresh,因此来分析下AbstractApplicationContext的refresh做了哪些事情
AbstractApplicationContext的refresh方法
首先来看下refresh的源码及解读时添加的注释
public void refresh() throws BeansException, IllegalStateException {
synchronized (this.startupShutdownMonitor) {
//1.刷新容器做准备
// Prepare this context for refreshing.
prepareRefresh();
//获取到DefaultListableBeanFactory对象
//2. 实例化DefaultListableBeanFactory的beanFactory
// Tell the subclass to refresh the internal bean factory.
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
//3. 对beanFactory进行填充
// Prepare the bean factory for use in this context.
prepareBeanFactory(beanFactory);
try {
//4. 本身是个模板方法,子类在实现时会往beanFactory添加后置处理器WebApplicationContextServletContextAwareProcessor
// Allows post-processing of the bean factory in context subclasses.
postProcessBeanFactory(beanFactory);
//5. beanFactory中填充BeanFactoryPostProcessors对象,
//先实例化实现了BeanDefinitionRegistryPostProcessor,再实例化实现了BeanFactoryPostProcessor的类,均包括系统的和用户自定义实现的
// Invoke factory processors registered as beans in the context.
invokeBeanFactoryPostProcessors(beanFactory);
//6. 将实现了BeanPostProcessor接口的类注入到容器中
//获取所有实现BeanPostProcessor的类,
// Register bean processors that intercept bean creation.
registerBeanPostProcessors(beanFactory)
// 7.初始化MessageSource
// Initialize message source for this context.
initMessageSource();
//8. 初始化Spring的事件多播器ApplicationEventMulticaster
// Initialize event multicaster for this context.
initApplicationEventMulticaster();
//9. 模板方法,供子类实现
// Initialize other special beans in specific context subclasses.
onRefresh();
// 10. 注册监听器
// Check for listener beans and register them.
registerListeners();
// 11.实例化所有单例的非懒加载的Bean,完成依赖注入
// Instantiate all remaining (non-lazy-init) singletons.
finishBeanFactoryInitialization(beanFactory);
//12. 声明周期方法lifecycleProcessor的初始化及刷新,发布事件等等
// Last step: publish corresponding event.
finishRefresh();
}
catch (BeansException ex) {
if (logger.isWarnEnabled()) {
logger.warn("Exception encountered during context initialization - " +
"cancelling refresh attempt: " + ex);
}
// Destroy already created singletons to avoid dangling resources.
destroyBeans();
// Reset 'active' flag.
cancelRefresh(ex);
// Propagate exception to caller.
throw ex;
}
finally {
// Reset common introspection caches in Spring's core, since we
// might not ever need metadata for singleton beans anymore...
resetCommonCaches();
}
}
}
按照源码中添加注释的序号,来对refresh方法进行总结和梳理下:
1. prepareRefresh() 刷新容器做准备
在environment对象中初始化到MutablePropertySources属性源中
2. obtainFreshBeanFactory() 获取DefaultListableBeanFactory类型的BeanFactory
2.1 首先区分两个容易混淆的概念
BeanFactory: 属于Spring的核心接口,也是一个根接口,负责对bean的实例化,访问,定位等,通常称作bean工厂
FactoryBean: 是工厂类的接口,能生产或者修饰对象生成的工厂Bean。
2.2 一个重要的类DefaultListableBeanFactory
DefaultListableBeanFactory继承自AbstractAutowireCapableBeanFactory实现了ConfigurableListableBeanFactory, BeanDefinitionRegistry接口是,Spring注册及加载bean的默认实现。
DeafultListableBeanFactory所实现的接口及接口作用:
AliasRegistry:AliasRegistry是制定别名的管理规则,定义了对alias的简单的简单增改删等操作。
SimpleAlliasRegistry:主要是用map作为alias的缓存,并对接口AliasRegistry进行实现。
SingletonBeanRegistry:定义对单例的注册及获取。
BeanFactory:定义获取bean及bean的各种属性
DefaultSingletonBeanRegistry:对接口SingletonBeanRegistry各函数的实现。
HierarchicalBeanFactory:继承BeanFactory,也就是在BeanFactory的基础上定义了对parentFactory的支持。
BeanDefinitionRegistry:定义对BeanDefinition的各种增改删操作。BeanDefinition中定义的属性有诸如类名、sccope、属性、构造函数参数列表、依赖的bean、是否单例类、是否懒加载等,其实就是将Bean的定义信息存储到这个BeanDefinition相应的属性中,之后对Bean的操作就是直接对BeanDefinition进行的。
FactoryBeanRegistrySupport:在DefaultSingletonBeanRegistry基础上增加了对FactoryBean的特殊处理功能。
ConfigurableBeanFactory:提供配置Factory的各种方法。
ListableBeanFactory:根据各种条件获得bean的配置清单。
AbstractBeanFactory:综合FactoryBeanRegistrySupport和ConfigurableBeanFactory的功能。
AutowireCapableBeanFactory:提供创建bean自动注入,初始化以及应用bean的后置处理器
AbstractAutowireCapableBeanFactory:综合AbstractBeanFactory并对接口Autowire,CapableBeanFactory进行实现。
ConfigurableListableBeanFactory:BeanFactory配置清单,指定忽略类型及接口等。
3. prepareBeanFactory() 对BeanFactory进行填充
4. postProcessBeanFactory() 本身是个模板方法,供子类扩展
通过debug发现,AnnotationConfigServletWebServerApplicationContext会先调用父类ServletWebServerApplicationContext的postProcessBeanFactory添加一个WebApplicationContextServletContextAwareProcessor的BeanPostProcessor。WebApplicationContextServletContextAwareProcessor的作用主要是从ConfigurableWebApplicationContext上下文中获取 ServletContext 和 ServletConfig 对象。
ServletWebServerApplicationContext#postProcessBeanFactory
protected void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
beanFactory.addBeanPostProcessor(new WebApplicationContextServletContextAwareProcessor(this));
beanFactory.ignoreDependencyInterface(ServletContextAware.class);
registerWebApplicationScopes();
}
5. invokeBeanFactoryPostProcessors() 分别实例化实现了BeanDefinitionRegistryPostProcessor和实现了BeanFactoryPostProcessor的类
扩展点,当前章节不做详解
6. registerBeanPostProcessors() 注册所有实现BeanPostProcessor的类
扩展点,当前章节不做详解
7. initMessageSource() 初始化MessageSource
8. initApplicationEventMulticaster() 初始化事件多播器ApplicationEventMulticaster
9. onRefresh() 模板方法,供子类实现,在springboot中此处的实现类会createWebServer实现内嵌web服务器的启动(如TomcatWebServer)
10. registerListeners() 注册监听器
11. finishBeanFactoryInitialization() 实例化所有单例的非懒加载的Bean
此处涉及到bean的创建,内容较多,会在下一节详细介绍
12. finishRefresh() 声明周期方法lifecycleProcessor的初始化及刷新,发布事件等等
总结
refresh方法
1.引出了注册及加载bean的默认实现DefaultListableBeanFactory
2.在实例化所有单例的非懒加载的Bean前,对spring的扩展点BeanFactoryPostProcessors和BeanPostProcessors进行注册
3.实现内嵌web服务器(如Tomcat)的创建和启动
4.实例化所有单例的非懒加载的Bean