springboot源码笔记

配置加载覆盖值顺序

  1. 开发工具主目录上的全局设置属性(~/.spring-boot-devtools.properties,当开发工具处于活动状态时)
  2. 测试中的@TestPropertySource注解
  3. 测试的属性。在@SpringBootTest和测试注释上提供,用于测试应用程序的特定部分。
  4. 命令行参数
  5. SPRING_APPLICATION_JSON的属性(嵌入在环境变量或系统属性中的内联json)。
  6. ServletConfig 初始化参数
  7. ServletContext 初始化参数
  8. java:comp/env的JNDI参数
  9. Java系统属性(System.getProperties()).
  10. 操作系统环境变量.
  11. RandomValuePropertySource,其属性仅为random.*。
  12. 在打包的JAR之外配置特定的应用程序属性(application-{profile}.properties和yaml变量)。
  13. 在打包的JAR之中配置特定的应用程序属性(application-{profile}.properties和yaml变量)
  14. 打包JAR之外的应用程序属性(application.properties和yaml变量)。
  15. 打包JAR之内的应用程序属性(application.properties和yaml变量)。
  16. @PropertySource注解在你的@Configuration 类.
  17. 默认属性(通过设置SpringApplication.setDefaultProperties指定)。

ApplicationEvent顺序

  • ApplicationStartingEvent

prepareEnvironment

  • ApplicationEnvironmentPreparedEvent

prepareContenxt load beans (benDefinitions)

  • ApplicationContextInitializedEvent
  • ApplicationPreparedEvent

refreshContext  refresh

tomcat stated 8080

  • ServletWebServerInitializedEvent

event managementContex.refresh()

tomcat stated 6888

  • ServletWebServerInitializedEvent
  • ContextRefreshedEvent 8080(2.1)  6888(2.3)
  • ContextRefreshedEvent 6888  8080

afterRefresh

  • ApplicationStartedEvent
  • AvailabilityChangeEvent
  • ApplicationReadyEvent
  • AvailabilityChangeEvent

Configuration解析

ConfigurationClassParser#parse,#doProcessConfigurationClass

递归解析全部beanDefinitions

解析顺序 

  • @Component
  • @PropertySources
  • @ComponentScan
  • @Import
  • @ImportResource
  • @Bean methods
  • @Bean default methods on interfaces
  •  解析SupperClass,去重
  • 最后调用DeferredImportSelectorGroupingHandler#processGroupImports加载@EnableAutoConfiguration,然后排序

DeferredImportSelectorGroupingHandler#processGroupImports

autoConfiguration加载入口,排序

AutoConfigurationImportListener

处理autoConfiguration加载事件,未排序,不可修改数据

AutoConfugrations#sort

排序规则

  1. 按字母排序
  2. 按@AutoConfigureOrder排序
  3. 按@AutoConfigureBefore @AutoConfigureAfter排序

BeanDefinition加载

Configuration解析完成后,调用ConfigurationClassBeanDefinitionReader#loadBeanDefinitions加载beanDefinition

ConfigurationClassBeanDefinitionReader#loadBeanDefinitions

  • beanName存在就不注册
  • 注册自身
  • 注册@Bean beanMethod
  • 注册@ImportResource
  • 注册interface ImportBeanDefinitionsRegistrar

Bean加载


发表评论 / Comment

用心评论~