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事件

 

 

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值