二 Spring Boot配置
发布日期:2021-05-14 14:50:44 浏览次数:27 分类:精选文章

本文共 5535 字,大约阅读时间需要 18 分钟。

Spring Boot 配置详解

一、配置文件

1. 配置文件作用

Spring Boot 使用一个全局的配置文件,文件名固定为:

  • application.properties
  • application.yml

配置文件的作用是修改 Spring Boot 自动配置的默认值。Spring Boot 在底层都给我们自动配置好了,但我们可以通过配置文件来修改默认值。

2. YAML 语法

YAML(YAML Ain’t Markup Language,缩写为 YAML)是一种标记语言,常用于配置文件。

YAML 的特点

  • YAML 是一种以数据为中心的标记语言,相比 JSON、XML 更适合配置文件。

  • YAML 的配置示例:

    server:
    port: 8081
  • XML 的配置示例(对比 YAML):

    8081

3. YAML 配置示例

以下是一些常见的 YAML 配置示例:

# 字面量配置
server:
port: 8081
path: /hello
# 对象配置
friends:
lastName: zhangsan
age: 20
# 数组配置
pets:
- cat
- dog
- pig
# 行内写法
pets: [cat, dog, pig]

4. 配置文件值注入

在 Spring Boot 中,可以通过 @Value@ConfigurationProperties 来注入配置文件值。

@Value 和 @ConfigurationProperties 对比

功能 @ConfigurationProperties @Value
批量注入配置文件属性 支持 不支持
松散绑定 支持 不支持
SpEL 支持 不支持 支持
数据校验 支持 不支持
复杂类型封装 支持 不支持

5. 配置文件注入值

1. properties 配置文件

person:
lastName: 张三
age: 18
boss: false
birth: 2017/12/12
maps:
k1: v1
k2: 12
lists:
- lisi
- zhaoliu
dog:
name: 小狗
age: 12

2. JavaBean 统一配置

@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String lastName;
private Integer age;
private Boolean boss;
private Date birth;
private Map
maps;
private List
lists;
private Dog dog;
}

6. @PropertySource 和 @ImportResource

@PropertySource

  • 用于加载指定的配置文件。

    @PropertySource(value = { "classpath:person.properties" })
    @Component
    @ConfigurationProperties(prefix = "person")
    class Person {
    // ...
    }

@ImportResource

  • 用于导入 Spring 的配置文件。

    @ImportResource(locations = { "classpath:beans.xml" })

    但是,Spring Boot 推荐使用全注解的方式来管理组件。

二、配置文件加载位置

Spring Boot 启动时,会扫描以下位置的 application.propertiesapplication.yml 文件:

  • file:./config/
  • file:./
  • classpath:/config/
  • classpath:/
  • 优先级从高到低,高优先级的配置会覆盖低优先级的配置。

    配置文件位置调整

    可以通过 spring.config.location 参数来改变默认配置文件位置。

    java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --spring.config.location=G:/application.properties

    三、自动配置原理

    1. 自动配置原理概述

    • Spring Boot 启动时,会加载大量的自动配置类。

    2. 自动配置类的作用

    • Spring Boot 提供了大量自动配置类,例如:

      spring.autoconfigure.enable= true

      会自动启用所有相关的自动配置类。

    3. 自动配置工作流程

  • Spring Boot 启动后,会加载 META-INF/spring.factories 文件。

  • SpringFactoriesLoader 加载所有 jar 包下的 spring.factories 文件。

  • spring.factories 中获取所有启用 @EnableAutoConfiguration 的类。

  • 将这些类加入到 Spring 容器中。

  • 自动配置类会根据条件(@Conditional)决定是否生效。

  • 4. 自动配置示例

    HttpEncodingAutoConfiguration 为例:

    @Configuration
    @EnableConfigurationProperties(HttpEncodingProperties.class)
    @ConditionalOnWebApplication
    @ConditionalOnClass(CharacterEncodingFilter.class)
    public class HttpEncodingAutoConfiguration {
    private final HttpEncodingProperties properties;
    public HttpEncodingAutoConfiguration(HttpEncodingProperties properties) {
    this.properties = properties;
    }
    @Bean
    @ConditionalOnMissingBean(CharacterEncodingFilter.class)
    public CharacterEncodingFilter characterEncodingFilter() {
    CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();
    filter.setEncoding(this.properties.getCharset().name());
    filter.setForceRequestEncoding(this.properties.shouldForce(Type.REQUEST));
    filter.setForceResponseEncoding(this.properties.shouldForce(Type.RESPONSE));
    return filter;
    }
    }

    四、配置文件注入数据校验

    可以通过 @Validated 注解来对配置文件注入的值进行数据校验。

    @Component
    @ConfigurationProperties(prefix = "person")
    @Validated
    public class Person {
    @Email
    private String lastName;
    @Value("${person.age}")
    private Integer age;
    private Boolean boss;
    private Date birth;
    private Map
    maps;
    private List
    lists;
    private Dog dog;
    }

    五、Profile 多环境配置

    1. 多 Profile 文件

    • 配置文件名称可以是 application-{profile}.properties/yml

    • 默认使用 application.properties 的配置。

    2. YAML 多文档块

    server:
    port: 8081
    spring:
    profiles:
    active: prod
    ---
    server:
    port: 8083
    spring:
    profiles: dev
    ---
    server:
    port: 8084
    spring:
    profiles: prod

    3. 激活指定 Profile

    • 在配置文件中指定:

      spring.profiles.active=dev
    • 或者通过命令行参数:

      java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev

    六、配置文件占位符

    1. 随机数占位符

    • 配置文件中可以使用以下占位符:

      person.last-name=张三${random.uuid}
      person.age=${random.int}
      person.birth=2017/12/15

    2. 配置文件值获取

    • 配置文件中可以使用占位符获取之前配置的值。

      person.dog.name=${person.hello:hello}_dog

      如果值不存在,可以指定默认值。

    七、外部配置加载顺序

    Spring Boot 从以下位置加载配置文件,优先级从高到低:

  • 命令行参数

    java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --server.port=8087 --server.context-path=/abc
  • Java:comp/env 的 JNDI 属性

  • Java 系统属性

  • 操作系统环境变量

  • RandomValuePropertySource 配置的 random.* 属性值

  • jar 包外部的 application-{profile}.propertiesapplication.yml(带 spring.profile)

  • jar 包内部的 application-{profile}.propertiesapplication.yml(带 spring.profile)

  • jar 包外部的 application.propertiesapplication.yml(不带 spring.profile)

  • jar 包内部的 application.propertiesapplication.yml(不带 spring.profile)

  • @Configuration 注解类上的 @PropertySource

  • 通过 SpringApplication.setDefaultProperties 指定默认属性

  • 所有支持的配置加载来源。

    八、自动配置原理详解

    1. 自动配置原理

    • Spring Boot 启动时会自动加载大量的自动配置类。

    • 自动配置类通过 @EnableAutoConfiguration 启用。

    • 自动配置类会根据条件(@Conditional)决定是否生效。

    2. 自动配置工作流程

  • 启用 @EnableAutoConfiguration 会启用所有相关自动配置类。

  • 自动配置类会根据条件(@Conditional)判断是否生效。

  • 自动配置类会给容器中添加组件,并将组件的属性从配置文件中获取。

  • 3. 自动配置示例

    HttpEncodingAutoConfiguration 为例:

    • 加载 HttpEncodingAutoConfiguration 类。

    • 检查是否满足 @ConditionalOnWebApplication@ConditionalOnClass 的条件。

    • 如果满足条件,给容器中添加 CharacterEncodingFilter 组件。

    • 组件的属性从 HttpEncodingProperties 类中获取。

    • HttpEncodingProperties 类通过 @ConfigurationProperties 与配置文件中的属性绑定。

    九、技术总结

    • Spring Boot 的自动配置功能非常强大,可以通过配置文件快速搭建项目。

    • 配置文件支持 YAML 和 properties 格式,易于使用。

    • 自动配置原理基于 @EnableAutoConfiguration@Conditional 注解。

    • 在开发项目时,可以通过配置文件灵活配置各种组件的属性。

    • 支持多环境配置和占位符,方便项目部署和环境切换。

    上一篇:Spring Boot与日志
    下一篇:Spring Boot入门

    发表评论

    最新留言

    关注你微信了!
    [***.104.42.241]2025年04月18日 01时34分02秒