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注解

你可能感兴趣的:(spring,spring,java,spring,boot)