spring-boot 加载配置文件和配置注入流程

一、重要对象

流程涉及的几个重要对象

  • StringValueResolver:bean工厂依赖此对象来解析配置值
  • ConfigFileApplicationListener:读取配置文件并放入Context中
  • PropertySourcesPlaceholderConfigurer:实现BeanFactoryPostProcessor接口,从context中获取配置,构建StringValueResolver并放入bean工厂
  • PropertyPlaceholderAutoConfiguration:被标注了@Configuration注解,定义了PropertySourcesPlaceholderConfigurer bean
  • AutowiredAnnotationBeanPostProcessor:拦截bean的创建处理@Value注解
二、流程概述

可以概括分为以下几步

  1. 读取配置文件放入Context
  2. 将PropertySourcesPlaceholderConfigurer对象放入容器
  3. 调用PropertySourcesPlaceholderConfigurer.postProcessBeanFactory()方法创建StringValueResolver对象放入bean工厂
  4. 将AutowiredAnnotationBeanPostProcessor放入容器
  5. 拦截bean工厂创建bean过程,通过StringValueResolver解析@Value注解,注入值
三、具体调用流程
  1. 读取配置文件放入Context
    通过ConfigFileApplicationListener对象完成
调用
构造函数中调用
调用
调用
调用
调用
调用
调用
SpringApplication.run()
application=new SpringApplication()
setListeners(getSpringFactoriesInstances(ApplicationListener.class))
从spring-boot-*.jar中读取/META-INF/spring.factories文件
加载ConfigFileApplicationListener类
application.run()
SpringApplicationRunListeners listeners = getRunListeners(args)
从spring-boot-*.jar中读取/META-INF/spring.factories文件
加载EventPublishingRunListener类
prepareEnvironment()
listeners.environmentPrepared()
EventPublishingRunListener.environmentPrepared()
ConfigFileApplicationListener.onApplicationEvent()
onApplicationEnvironmentPreparedEvent()
postProcessEnvironment()
读取配置文件放入Context
  1. 将PropertySourcesPlaceholderConfigurer对象放入容器
    • PropertyPlaceholderAutoConfiguration对象中定义了PropertySourcesPlaceholderConfigurer这个bean,而PropertyPlaceholderAutoConfiguration定义在spring-boot-autoconfigure-*.jar/META-INF/spring.factories文件中,在spring-boot扫描时被加载并解析
调用
调用
加载
调用
调用
调用
调用
调用
SpringApplication.run()
application=new SpringApplication()
application.run()
createApplicationContext()
context=new AnnotationConfigServletWebServerApplicationContext()
refreshContext()
context.refresh()
invokeBeanFactoryPostProcessors()
PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors
invokeBeanDefinitionRegistryPostProcessors()
ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry()
读取spring-boot-autoconfigure-*.jar/META-INF/spring.factories文件
解析PropertyPlaceholderAutoConfiguration对象,将
PropertySourcesPlaceholderConfigurer放入容器
  1. 调用PropertySourcesPlaceholderConfigurer.postProcessBeanFactory()方法将配置文件数据放入bean工厂
调用
调用
加载
调用
调用
调用
调用
调用
调用
调用
调用
SpringApplication.run()
application=new SpringApplication()
application.run()
createApplicationContext()
context=new AnnotationConfigServletWebServerApplicationContext()
refreshContext()
context.refresh()
invokeBeanFactoryPostProcessors()
PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors
invokeBeanFactoryPostProcessors()
PropertySourcesPlaceholderConfigurer.postProcessBeanFactory()
processProperties()
(PlaceholderConfigurerSupport)doProcessProperties()
ConfigurableListableBeanFactory.addEmbeddedValueResolver()
将StringValueResolver对象放入工厂
  1. 将AutowiredAnnotationBeanPostProcessor放入容器
调用
加载
构造方法中加载
构造方法中调用
向容器中添加
SpringApplication.run()
createApplicationContext()
AnnotationConfigServletWebServerApplicationContext.class
AnnotatedBeanDefinitionReader.class
AnnotationConfigUtils.registerAnnotationConfigProcessors()
AutowiredAnnotationBeanPostProcessor
  1. 拦截bean工厂创建bean过程,通过StringValueResolver解析@Value注解,注入值
调用
调用
调用
调用
调用
调用
调用
调用
调用
返回值
创建bean流程
AutowiredAnnotationBeanPostProcessor
.postProcessMergedBeanDefinition()
findAutowiringMetadata()
InjectionMetadata.checkConfigMembers()
AutowiredAnnotationBeanPostProcessor
.postProcessProperties()
findAutowiringMetadata()
InjectionMetadata.inject()
AutowiredFieldElement.inject()
DefaultListableBeanFactory.resolveDependency
DefaultListableBeanFactory.doResolveDependency
getAutowireCandidateResolver()
.getSuggestedValue(descriptor)
是否字符串
resolveEmbeddedValue()
处理@Value注解
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值