面试篇:框架-spring_refresh

本文详细阐述了Spring应用程序上下文初始化的12个关键步骤,包括Environment的解析、BeanFactory的获取与完善、Bean后处理器的注册以及国际化和事件管理。这些步骤揭示了Spring如何加载配置、处理依赖注入并初始化bean,为应用程序提供完整的服务。
摘要由CSDN通过智能技术生成

refresh 12 个步骤

在这里插入图片描述

1. prepareRefresh

创建和准备Environment对象
  • Environment的作用之一是为后续@Value,值注入时提供键值
    在这里插入图片描述
Environment对象的作用:解析键值

在这里插入图片描述
QualifierAnnotationAutowireCandiateResolver类成员方法getSuggestedValue用于获取对应key的Object类value
(无法解析其中的$和#等占位符)
在这里插入图片描述

使用StandardEnvironment类对象的成员方法resolvePlaceholders()来解析$占位符
在这里插入图片描述

解析properties中自定义的值需要使用getPropertySources().addLast方法
在这里插入图片描述

解析既有$又有#的值时,先解析$,再使用evaluate方法解析#
在这里插入图片描述

2. obtainFreshBeanFactory

这一步获取(或创建)BeanFactory
  • BeanFactory的作用是负责bean的创建,依赖注入和初始化
  • BeanDefinition作为bean的设计蓝图,规定了bean的特征,如单例多例,依赖关系,初始销毁方法等
  • BeanDefinition的来源有多种多样,可以是通过xml获得,通过配置类获得,通过组件扫描获得,也可以编程添加
  • 注:BeanFactory本是Application Context的父类,在此处为组合关系,后者使用了前者创建实例等功能
BeanDefinition的来源

1) 从xml获取
在这里插入图片描述
2)编程添加及从配置类获取
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如上图,通过registerBeanDefinition方法以编程的方式添加了"Config1"作为BeanDefinition。使用postProcessor方法将Config1中@Bean注解标注的类添加为BeanDefinition

3) 扫描获取
在这里插入图片描述

3. prepareBeanFactory

这一步会完善BeanFactory,包括解析SpEL,类型转换器,特殊Bean注入等
  • StandardBeanExpressionResolver来解析SpEL
  • ResourceEditorRegistrar会注释类型转换器,并引用ApplicationContext提供的Environment完成${}解析
  • 特殊的bean指beanFactory以及ApplicationContext,通过registerResolvableDependency来注册他们
  • ApplicationContextAwareProcessor用来解析Aware接口
    在这里插入图片描述

4.postProcessBeanFactory

这一步是空的,留给子类来扩展
  • 一般Web环境的ApplicationContext都要利用它注册新的Scope,完善Web下的BeanFactory
  • 体现的是模板方法设计模式

5. invokeBeanFactoryPostProcessors

beanFactory后处理器,充当beanFactory的扩展点,可以用来补充或修改BeanDefinition
  • ConfigurationClassPostProcessor用于解析@Configuration,@Bean,@Import,@PropertySource等
  • PropertySourcesPlaceHolderConfigurer-替换BeanDefinition中的${}
    在这里插入图片描述

6. registerBeanPostProcessors

bean后处理器,充当bean的扩展点,可以工作在bean的实例化,依赖注入,初始化阶段
  • AutowiredAnnotationBeanPostProcessor 功能有:解析 @Autowired @Value注解
  • CommonAnnotationBeanPostProcessor 功能有:解析@Resource,@PostConstruct,@PreDestroy
  • AnnotationAwareAspectJAutoProxyCreate 功能有:为符合切点目标 bean 自动创建代理
    在这里插入图片描述
    注:在注册BeanDefinition时添加对应的bean后置处理器,之后Bean Factory会注册这些后置处理器(BeanPostProcessor)

7. initMessageSource

实现国际化
  • 看beanDefinitionMap中有没有名为messageSource的bean,如果没有,则提供空的MessageSource实现
    在这里插入图片描述

8. initApplicationEventMulticaster

用来发布时间给监听器
  • 可以从容器(BeanDefinitionMap)中找到名为applicationEventMulticaster的bean作为事件广播器,若没有,也会新建默认的事件广播器
  • 可以调用ApplicationContext.publishEvent(事件对象)来发布事件
    在这里插入图片描述

9. onRefresh

这一步是空实现,留给子类扩展
  • SpringBoot中的子类可以在这里准备WebServer,即内嵌web容器
  • 体现的是模板方法设计模式

10. registerListeners

用来接受事件
  • 一部分监听器是事先编程添加的,另一部分监听器来自容器中的bean,还有一部分来自于@EventListener解析
  • 实现ApplicationListener接口,重写其中onApplicationEvent(E e)方法即可

11. finishBeanFactoryInitialization

  • conversionService也是一套转换机制,作为对PropertyEditor的补充
  • 内前置解析器用来解析@Value中的${},借用的是Environment的功能
  • 单例池用来缓存所有单例对象,对象的创建都分三个阶段,每一个阶段都有不同的bean后处理器参与进来,扩展功能
    在这里插入图片描述
    注:BeanFactory会先对容器中采取非延迟单例的类创建实例

12. finishRefresh

用来控制容器内需要生命周期管理的bean
  • 如果容器中有名称为lifecycleProcessor的bean就用它,否则创建默认的生命周期管理器
  • 调用context的start,即可触发所有实现LifeCycle接口bean的start
  • 调用context的stop,即可触发所有实现LifeCycle接口bean的stop
    在这里插入图片描述

部分内容转自b站黑马程序员视频:https://www.bilibili.com/video/BV15b4y117RJ?p=136

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值