SpringBoot配置详解

原理

自动配置:

pom.xml
  • spring-boot-dependencies:核心依赖在父工程中
  • 所以引入依赖时,不需要指定版本

启动器

  • <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starte</artifactId>
    </dependency>
    
  • 启动器:就是Springboot的启动场景

  • 比如:spring-boot-starter-web,就会自动导入web环境所有的依赖

  • Springboot会将所有的功能场景变成一个个启动器

  • 要使用什么功能,就只需要找到对应的启动器就可以starter

主程序

//标注此类是一个Springboot应用
@SpringBootApplication
public class HelloworldApplication {
	//将Springboot应用启动
    public static void main(String[] args) {
        SpringApplication.run(HelloworldApplication.class, args);
    }
}
  • 注解

    • @SpringBootConfiguration:Springboot的配置
      	@Configuration:spring配置类
          	@Component:是一个组件
          
          
      @EnableAutoConfiguration:自动配置
          @AutoConfigurationPackage:自动配置包
          	@Import({Registrar.class}):自动配置包`注册`
          
          @Import({AutoConfigurationImportSelector.class}):自动配置导入选择
          
      //获取所有的配置
      List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);
      
获取候选的配置
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
    List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());
    Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.");
    return configurations;
}

META-INF/spring.factories:自动配置的核心文件

//所有的资源加载到配置类中
Properties properties = PropertiesLoaderUtils.loadProperties(resource);

结论:springboot的所有自动配置都是在启动的时候扫描并加载的,spring.factories所有的自动配置类都在这里,但是不一定生效,要判断条件是否成立(同过@ConditionalOnMissingXxx),只要导入了对应的starter,就由对应的启动器了,有了启动器,自动装配就会生效。然后就配置成功了

  1. springboot在启动时,从类(org.springframework.boot:spring-boot-autoconfigure)路径META-INF/spring.factories获取指定的值
  2. 将这些自动配置的类导入容器,自动配置类就会生效,帮我们进行自动配置
  3. 以前需要自动配置的东西,现在springboot帮我们做
  4. 整个javaee,解决方案和自动配置的东西都在spring-boot-autoconfigure包下
  5. 它会把所有需要导入的组件,以类名的方式返回,这些组件会被添加到容器中
  6. 容器中也会存在非常多的XxxAutoConfigure的文件(@Bean),就是这些类给容器中导入了这个场景需要的所有组件,并自动配置,@Configuration
  7. 有了自动配置类,就免去了我们手动编写配置文件的工作

配置文件

  • //SPEL表达式加载配置,不推荐
    @Value("${name}")
    
  • properties:key=value

    • //指定配置文件
      @PropertySource(value = "classpath:Xxx.properties")
      
  • yml/yaml:key:空格value

    • //加载yml配置
      @ConfigurationProperties(prefix = "person")
      
@ConfigurationProperties @Value
功能 批量注入配置文件中的属性 单个指定
松散绑定 支持 不支持
SPEL 不支持 支持
JSR303数据校验 支持 不支持
复杂类型封装 支持 不支持
  • 松散绑定:yml中属性是last-name,等同于lastName
  • JSR303:字段增加过滤验证,保证数据合法
    • 类上@Validated:要数据校验,然后字段上加上校验类型,如:@Email
  • 复杂类型封装:yml中可以封装对象

结论:

  • 推荐yml
  • 只需要获取文件中某个值,用@Value
  • 编写了JavaBean来和配置文件映射,就使用@ConfigurationProperties
配置文件位置
优先级从高到低
  • 项目config文件里
  • 项目根目录下
  • resource下
  • resource下config里
不同环境

不同环境下,可以配置不同的配置文件。默认配置文件:application.yml

  • 开发:application-dev.yml
  • 测试:application-test.yml
多环境配置
  1. 多个配置文件

    #配置application-test.yml为默认配置文件
    spring:
      profiles:
        active: test
    
  2. application.yml单个配置文件

    #默认使用test环境
    server:
      port: 8081
    spring:
      profiles:
        active: test
    
    ---
    server:
      port: 8083
    spring:
      profiles: dev
    
    ---
    server:
      port: 8084
    spring:
      profiles: test
    
配置原理

配置文件中能配置的东西。规律: XxxxAutoConfiguration去自动装配东西,有默认值,XxxProperties可以和配置文件绑定,就可以使用自定义配置

自动装配原理总结:

  • SpringBoot启动会加载大量的自动配置类
  • 看我们需要的功能是否在SpringBoot默认写好的自动配置类中
  • 在的话就不需要手动配置,否则要手动配置
  • 给容器中自动配置类添加组件的时候,会从properties中获取某些属性。我们只需要在配置文件中指定这些属性值即可

xxxAutoConfiguration:自动配置类,给容器中添加组件

xxxProperties:封装配置文件中相关属性

可以通过配置debug:true查看配置有无生效

posted @ 2021-08-17 15:49  jpy  阅读(352)  评论(0编辑  收藏  举报