栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Spring之refresh的12个步骤

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring之refresh的12个步骤

     根据B站黑马视频总结

1. refresh的12个步骤
  1. prepareRefresh
  2. obtainFreshBeanFactory
  3. prepareBeanFactory
  4. postProcessBeanFactory
  5. invokeBeanFactoryPostProcessors
  6. registerBeanPostProcessors
  7. initMessageSource
  8. initApplicationEventMulticaster
  9. onRefresh
  10. registerListeners
  11. finishBeanFactoryInitialization
  12. 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. 总结
  1. prepareRefresh:准备好环境变量,配置变量
  2. obtainFreshBeanFactory:创建或获取bean工厂
  3. prepareBeanFactory:准备bean工厂
  4. postProcessBeanFactory:子类去扩展bean工厂
  5. invokeBeanFactoryPostProcessors:自定义beanFactory后置处理器去扩展bean工厂
  6. registerBeanPostProcessors:准备bean后置处理器
  7. initMessageSource:为spring容器提供国际化功能
  8. initApplicationEventMulticaster:为spring容器提供事件发布器
  9. onRefresh:留给子类对spring容器进行扩展
  10. registerListeners:为spring容器注册监听器
  11. finishBeanFactoryInitialization:初始化剩余的非懒加载单例bean,执行bean后置处理器扩展
  12. finishRefresh:准备spring容器生命周期管理器,发布contextRefreshed事件

 

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/315195.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号