Spring#IOC#AbstractApplicationContext#refresh
2021-11-04 16:35:54 0 举报
Spring IOC容器启动流程 AbstractApplicationContext#refresh()方法整个过程做了什么事情?
作者其他创作
大纲/内容
ContextLoaderListener#contextInitialized
停止应用
常见的,如果解析到<context:component-scan base-package=\"com.joonwhee.open\" /> 注解时,会扫描 base-package 指定的目录,将该目录下使用指定注解(@Controller、@Service、@Component、@Repository)的 bean 定义也同样封装成 BeanDefinition,加载到 BeanFactory 中。
配置 beanFactory 的标准上下文特征,例如上下文的 ClassLoader、后置处理器等
Web.xml
Tomcat
该方法会解析所有 Spring 配置文件(通常我们会放在 resources 目录下),将所有 Spring 配置文件中的 bean 定义封装成 BeanDefinition,加载到 BeanFactory 中
BeanPostProcessor 接口是 Spring 初始化 bean 时对外暴露的扩展点,Spring IoC 容器允许 BeanPostProcessor 在容器初始化 bean 的前后,添加自己的逻辑处理。在这边只是注册到 BeanFactory 中,具体调用是在 bean 初始化的时候。
BeanFactoryPostProcessor 接口是 Spring 初始化 BeanFactory 时对外暴露的扩展点,Spring IoC 容器允许 BeanFactoryPostProcessor 在容器实例化任何 bean 之前读取 bean 的定义,并可以修改它。
ContextLoaderListener#contextDestroyed
具体的:在所有 bean 实例化时,执行初始化方法前会调用所有 BeanPostProcessor 的 postProcessBeforeInitialization 方法,执行初始化方法后会调用所有 BeanPostProcessor 的 postProcessAfterInitialization 方法。
obtainFreshBeanFactory() 方法
prepareBeanFactory(beanFactory) 方法
完成此上下文的刷新,主要是推送上下文刷新完毕事件(ContextRefreshedEvent )到监听器。
允许子类对 BeanFactory 进行后续处理,默认实现为空,留给子类实现。
finishBeanFactoryInitialization(beanFactory) 方法
BeanDefinitionRegistryPostProcessor 继承自 BeanFactoryPostProcessor,比 BeanFactoryPostProcessor 具有更高的优先级,主要用来在常规的 BeanFactoryPostProcessor 激活之前注册一些 bean 定义。特别是,你可以通过 BeanDefinitionRegistryPostProcessor 来注册一些常规的 BeanFactoryPostProcessor,因为此时所有常规的 BeanFactoryPostProcessor 都还没开始被处理。
解析web.xml
父类ContextLoader:初始化化webApplicationContext
initApplicationEventMulticaster() 方法
这个方法会注册3个默认环境 bean:environment、systemProperties 和 systemEnvironment,注册 2 个 bean 后置处理器:ApplicationContextAwareProcessor 和 ApplicationListenerDetector。
该方法会实例化所有剩余的非懒加载单例 bean。除了一些内部的 bean、实现了 BeanFactoryPostProcessor 接口的 bean、实现了 BeanPostProcessor 接口的 bean,其他的非懒加载单例 bean 都会在这个方法中被实例化,并且 BeanPostProcessor 的触发也是在这个方法中。
startupShutdownMonitor 属性
初始化应用的事件广播器 ApplicationEventMulticaster。
AbstractApplicationContext#refresh
onRefresh() 方法
标红的方法为构建 IoC 构成中最重要的4个方法,简单的描述就是:obtainFreshBeanFactory 创建一个新的 BeanFactory、读取和解析 bean 定义。invokeBeanFactoryPostProcessors 提供给开发者对 BeanFactory 进行扩展。registerBeanPostProcessors 提供给开发者对 bean 进行扩展。finishBeanFactoryInitialization 实例化剩余的所有非懒加载单例 bean。
注册所有的 BeanPostProcessor,将所有实现了 BeanPostProcessor 接口的类加载到 BeanFactory 中。
postProcessBeanFactory(beanFactory) 方法
prepareRefresh() 方法
上面提到的“加载到 BeanFactory 中”的内容主要指的是以下3个缓存:beanDefinitionNames缓存:所有被加载到 BeanFactory 中的 bean 的 beanName 集合。beanDefinitionMap缓存:所有被加载到 BeanFactory 中的 bean 的 beanName 和 BeanDefinition 映射。aliasMap缓存:所有被加载到 BeanFactory 中的 bean 的 beanName 和别名映射。
初始化消息资源 MessageSource。
finishRefresh() 方法
为刷新准备新的上下文环境,设置其启动日期和活动标志以及执行一些属性的初始化,主要是一些准备工作
ContextLoader.initWebApplicationContext(ServletContext servletContext)
启动应用
用于“刷新”和“销毁”的同步监视器
实例化和调用所有 BeanFactoryPostProcessor,包括其子类 BeanDefinitionRegistryPostProcessor。
registerBeanPostProcessors(beanFactory) 方法
配置WebApplicationContext
invokeBeanFactoryPostProcessors(beanFactory) 方法
registerListeners() 方法
注册监听器。
initMessageSource() 方法
该方法为模板方法,提供给子类扩展实现,可以重写以添加特定于上下文的刷新工作,默认实现为空。
0 条评论
下一页