SpringBoot-原理解析

SpringBoot-原理解析

1、Profile功能

为了方便多环境适配,springboot简化了profile功能。

1、application-profile功能

  • 默认配置文件 application.yaml;任何时候都会加载
  • 指定环境配置文件 application-{env}.yaml
  • 激活指定环境
  • 配置文件激活
  • 命令行激活:java -jar xxx.jar --spring.profiles.active=prod --person.name=haha
  • 修改配置文件的任意值,命令行优先
  • 默认配置与环境配置同时生效
  • 同名配置项,profile配置优先

 

 

2、@Profile条件装配功能

@Configuration(proxyBeanMethods = false)
@Profile("production")
public class ProductionConfiguration {

    // ...

}

3、profile分组

spring.profiles.group.production[0]=proddb
spring.profiles.group.production[1]=prodmq

使用:--spring.profiles.active=production  激活

2、外部化配置

https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-external-config

  1. Default properties (specified by setting SpringApplication.setDefaultProperties).
  2. @PropertySource annotations on your @Configuration classes. Please note that such property sources are not added to the Environment until the application context is being refreshed. This is too late to configure certain properties such as logging.* and spring.main.* which are read before refresh begins.
  1. Config data (such as application.properties files)
  2. A RandomValuePropertySource that has properties only in random.*.
  1. OS environment variables.
  2. Java System properties (System.getProperties()).
  1. JNDI attributes from java:comp/env.
  2. ServletContext init parameters.
  1. ServletConfig init parameters.
  2. Properties from SPRING_APPLICATION_JSON (inline JSON embedded in an environment variable or system property).
  1. Command line arguments.
  2. properties attribute on your tests. Available on @SpringBootTest and the test annotations for testing a particular slice of your application.
  1. @TestPropertySource annotations on your tests.
  2. Devtools global settings properties in the $HOME/.config/spring-boot directory when devtools is active.

 

1、外部配置源

常用:Java属性文件YAML文件环境变量命令行参数

 

2、配置文件查找位置

(1) classpath 根路径

(2) classpath 根路径下config目录

(3) jar包当前目录

(4) jar包当前目录的config目录

(5) /config子目录的直接子目录

3、配置文件加载顺序:

  1.  当前jar包内部的application.properties和application.yml
  2.  当前jar包内部的application-{profile}.properties 和 application-{profile}.yml
  1.  引用的外部jar包的application.properties和application.yml
  2.  引用的外部jar包的application-{profile}.properties 和 application-{profile}.yml

4、指定环境优先,外部优先,后面的可以覆盖前面的同名配置项

3、自定义starter

1、starter启动原理

  • starter-pom引入 autoconfigurer 包
  • autoconfigure包中配置使用 META-INF/spring.factoriesEnableAutoConfiguration 的值,使得项目启动加载指定的自动配置类
  • 编写自动配置类 xxxAutoConfiguration -> xxxxProperties
  • @Configuration
  • @Conditional
  • @EnableConfigurationProperties
  • @Bean
  • ......

引入starter --- xxxAutoConfiguration --- 容器中放入组件 ---- 绑定xxxProperties ---- 配置项

2、自定义starter

atguigu-hello-spring-boot-starter(启动器)

atguigu-hello-spring-boot-starter-autoconfigure(自动配置包)

4、SpringBoot原理

Spring原理【Spring注解】、SpringMVC原理、自动配置原理、SpringBoot原理

1、SpringBoot启动过程

  • 创建 SpringApplication
  • 保存一些信息。
  • 判定当前应用的类型。ClassUtils。Servlet
  • bootstrappers:初始启动引导器(List<Bootstrapper>):去spring.factories文件中找 org.springframework.boot.Bootstrapper
  • ApplicationContextInitializer;去spring.factories
  • List<ApplicationContextInitializer<?>> initializers
  • ApplicationListener ;应用监听器。spring.factories
  • List<ApplicationListener<?>> listeners
  • 运行 SpringApplication
  • StopWatch
  • 记录应用的启动时间
  • 创建引导上下文(Context环境)createBootstrapContext()
  • bootstrappers 挨个执行
  • 让当前应用进入headless模式。java.awt.headless
  • 获取所有 RunListener(运行监听器)【为了方便所有Listener进行事件感知】
  • getSpringFactoriesInstances 去spring.factoriesSpringApplicationRunListener.
  • SpringApplicationRunListener 调用 starting 方法;
  • 相当于通知所有感兴趣系统正在启动过程的人,项目正在 starting。
  • 保存命令行参数;ApplicationArguments
  • 准备环境 prepareEnvironment();
  • 返回或者创建基础环境信息对象。StandardServletEnvironment
  • 配置环境信息对象。
  • 读取所有的配置源的配置属性值。
  • 绑定环境信息
  • listener.environmentPrepared()
  • 创建IOC容器(createApplicationContext())
  • 根据项目类型(Servlet)创建容器,
  • 当前会创建 AnnotationConfigServletWebServerApplicationContext
  • 准备ApplicationContext IOC容器的基本信息   prepareContext()
  • 保存环境信息
  • IOC容器的后置处理流程。
  • 应用初始化器;applyInitializers;
  • ApplicationContextInitializer 。调用
  • 刷新IOC容器。refreshContext
  • 创建容器中的所有组件(Spring注解)
  • 容器刷新完成后工作?afterRefresh
  • 调用所有runners;callRunners()
  • 获取容器中的
  • 合并所有runner并且按照@Order进行排序
  • 如果以上有异常,
  • 通知所有的监听器 running
  • running如果有问题。继续通知 failed 。调用所有 Listener 的 failed;通知所有的监听器 failed
原文地址:https://www.cnblogs.com/albertrui/p/15063455.html