Spring Boot 配置(官网文档解读)

目录

摘要

Spring Boot 配置加载顺序

配置文件加载顺序

Spring Boot 配置加载方式

@Value

@Value 注解简单示例

@ConfigurationProperties

启动 @ConfigurationProperties

@ConfigurationProperties 验证

@ConfigurationProperties 与 @Value 对比

@Autowired

@Autowired 自动装配的策略

@Autowired 三种注入方式

属性注入

构造函数注入

Setter 方法注入

Java Bean 属性绑定

构造函数绑定

JSON应用程序属性

命令行参数

配置加载拓展

 @ConstructorBinding

@DefaultValue

YAML 映射到属性的扁平化处理

接收YAML 的List 类型属性

接收YAML 的Map 类型属性

配置引入方式

spring.config.name 

Spring.config-location

Spring.config.additional-location

Spring.config.import

配置文件相关语法

可选的配置

通配符

属性占位符

多文档分割处理

配置系统环境属性

使用示例

配置文件的使用

配置激活

导入无拓展名的文件

配置随机值

Spring Boot 自动配置

查询自动配置详细说明

@Enable*注解

参考文献


摘要

        本文参考Spring 官方,对Spring Boot 外部化配置模块进行详细的阐述和总结。旨在为广大学习者和开发者提供一个关于Spring Boot 配置模块实用的参考资料。

        Spring Boot 可以帮助你在不同的环境中使用一套代码。你可以使用各种不同的配置方式,例如Java 属性文件、YAML 文件、环境变量和命令行参数等。 ​

Spring Boot 配置加载顺序

        在Spring Boot 中属性源是按一定的顺序进行加载的,并且后面的属性源可以覆盖前面属性源中定义的相同属性值 。在 Spring Boot 中,注入资源的覆盖过程如下:

  1. 默认属性:通过SpringApplication.setDefaultProperties(Map)设置的默认属性,这是最早被考虑的属性来源。

  2. @PropertySource 注解:在@Configuration类上使用@PropertySource注解指定的属性源。需要注意的是,这些属性源直到应用上下文刷新时才会添加到Environment中,因此对于某些在刷新开始前就需要读取的属性(如logging.*spring.main.*),这种方式配置为时已晚。

  3. 配置数据:例如application.properties等文件中的配置数据。

  4. 随机值属性源:RandomValuePropertySource,其属性仅存在于random.*中。

  5. 操作系统环境变量:操作系统层面设置的环境变量。

  6. Java 系统属性:通过System.getProperties()获取的 Java 系统属性。

  7. JNDI 属性:来自java:comp/env的 JNDI 属性。

  8. ServletContext 初始化参数:在 ServletContext 初始化时设置的参数。

  9. ServletConfig 初始化参数:在 ServletConfig 初始化时设置的参数。

  10. SPRING_APPLICATION_JSON 属性:嵌入在环境变量或系统属性中的内联 JSON 数据,即 SPRING_APPLICATION_JSON 中的属性。

  11. 命令行参数:在启动应用程序时通过命令行传递的参数。

  12. 测试属性:在测试中,@SpringBootTest及其他用于测试应用程序特定部分的测试注解中的properties属性。

  13. @DynamicPropertySource 注解:在测试中使用@DynamicPropertySource注解定义的动态属性源。

  14. @TestPropertySource 注解:在测试类上使用@TestPropertySource注解指定的属性源。

  15. Devtools 全局设置属性:当 Devtools 处于活动状态时,$HOME/.config/spring-boot目录中的 Devtools 全局设置属性

配置文件加载顺序

    Spring Boot 的配置文件按以下顺序加载:

  1. 打包在Jar包中的 application.properties

  2. 打包在Jar包中的 application-{profile}.properties

  3. 打包在Jar包之外的 application.properties

  4. 打包在Jar包之外的 application-{profile}.properties

        这个覆盖规则我们在简单部署生产项目的时候经常会用到,就是将项目的.properites /.yml配置文件复制一份,放在项目的Jar 包外。然后将生产环境相关的配置文件直接写在外部的配置文件中,再执行Jar -jar 命令启动程序,就可以直接使用Jar包外部关于生产环境的配置了。

Spring Boot 配置加载方式

@Value

   @Value 注解主要用于将外部配置文件(如 application.properties 或 application.yml)中的属性值注入到 Spring 管理的 Bean 的属性中。

@Value 注解简单示例
@Component
public class MyBean {@Value("${name}")private String name;// ...}

@ConfigurationProperties

   @ConfigurationProperties 提供了一种方便、灵活和可扩展的方式将外部配置文件中的属性绑定到 Java Bean 上。它支持简单和复杂的属性结构,包括嵌套属性、列表和映射,还支持构造函数绑定和属性验证。使用 @ConfigurationProperties 可以使配置管理更加清晰,将配置信息集中在 Java Bean 中,便于维护和测试。

        使用该注解时,要注意属性前缀的使用、不同属性类型的绑定方式以及属性验证的规则。它可以帮助你更好地组织和管理 Spring Boot 应用程序的配置信息,提高代码的可读性和可维护性,同时为不同的部署环境提供了更灵活的配置管理手段。

启动 @ConfigurationProperties

        为了使 @ConfigurationProperties 注解生效,你可以在主应用程序类上添加 @EnableConfigurationProperties 注解:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;@SpringBootApplication
@EnableConfigurationProperties(MyAppProperties.class)
public class MyAppApplication {public static void main(String[] args) {SpringApplication.run(MyAppApplication.class, args);}
}
@ConfigurationProperties 验证

        @ConfigurationProperties可以结合 JSR-303 约束注释,来确保这些属性符合预期的范围和格式。通过验证,可以防止因配置错误导致的运行时异常,提高应用程序的稳定性和可靠性。以下是官网提供的示例代码:

@ConfigurationProperties("my.service")
@Validated
public class MyProperties {@NotNullprivate InetAddress remoteAddress;// getters/setters...public InetAddress getRemoteAddress() {return this.remoteAddress;}public void setRemoteAddress(InetAddress remoteAddress) {this.remoteAddress = remoteAddress;}}

        要将验证级联到嵌套属性,关联字段必须用 注释@Valid。

@ConfigurationProperties("my.service")
@Validated
public class MyProperties {@NotNullprivate InetAddress remoteAddress;@Validprivate final Security security = new Security();// getters/setters...public InetAddress getRemoteAddress() {return this.remoteAddress;}public void setRemoteAddress(InetAddress remoteAddress) {this.remoteAddress = remoteAddress;}public Security getSecurity() {return this.security;}public static class Security {@NotEmptyprivate String username;// getters/setters...public String getUsername() {return this.username;}public void setUsername(String username) {this.username = username;}}}

@ConfigurationProperties 与 @Value 对比

特征

@ConfigurationProperties

@Value

宽松的束缚

是的

有限

元数据支持

是的

SpEL支持

是的

  • 如果您想使用@Value,我们建议您使用其规范形式(仅使用小写字母的 kebab-case)引用属性名称。这将允许 Spring Boot 使用与@ConfigurationProperties宽松绑定时相同的逻辑。

@Autowired

   @Autowired 是 Spring 框架中的一个注解,用于自动装配 Spring Bean。它允许 Spring 容器自动将依赖注入到类的属性、构造函数、setter 方法或其他方法中,从而实现依赖注入(Dependency Injection,DI),是控制反转(Inversion of Control,IoC)原则的一种实现方式。

@Autowired 自动装配的策略
  • 按类型:当使用 @Autowired 时,Spring 首先尝试按类型进行自动装配。它会查找容器中与属性或参数类型匹配的 Bean。如果只有一个匹配的 Bean,Spring 会将其注入。

  • 按名称:如果容器中有多个相同类型的 Bean,Spring 可以根据名称进行自动装配。你可以使用 @Qualifier 注解指定 Bean 的名称

@Autowired 三种注入方式

        @Autowired 包含三种注入方式,分别是属性注入,构造函数注入和Setter 方法注入。

属性注入
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class MyService {@Autowiredprivate MyRepository myRepository;
}
  • @Autowired 直接标注在属性上,Spring 容器会自动将 MyRepository 类型的 Bean 注入到 myRepository 属性中。

  • 这种方式比较简洁,但它将依赖关系隐藏在类的内部,对于测试可能不太方便,因为无法在不使用 Spring 容器的情况下轻松替换依赖。

构造函数注入
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class MyService {private final MyRepository myRepository;@Autowiredpublic MyService(MyRepository myRepository) {this.myRepository = myRepository;}
}
  • @Autowired 注解放在构造函数上,Spring 容器会在创建 MyService 实例时,自动将 MyRepository 类型的 Bean 注入到构造函数中。

  • 这种方式的优点是可以将依赖声明为 final,提高代码的健壮性和可测试性。

Setter 方法注入
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class MyService {private MyRepository myRepository;@Autowiredpublic void setMyRepository(MyRepository myRepository) {this.myRepository = myRepository;}
}
  • @Autowired 标注在 setMyRepository 方法上,Spring 容器会调用该方法,并将 MyRepository 类型的 Bean 作为参数传入,完成注入。

  • 这种方式在某些场景下比较灵活,尤其是当你需要在 setter 方法中添加额外的逻辑时。

Java Bean 属性绑定

        Java Bean 属性绑定是将外部配置源(如 application.properties 或 application.yml 文件)中的属性值映射到 Java Bean 的属性上的过程。这使得配置信息可以以对象的形式在 Spring 容器中管理和使用,方便代码中的访问和操作。

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;@Component
@ConfigurationProperties(prefix = "app")
public class AppConfig {private String name;private String version;private String description;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getVersion() {return version;}public void setVersion(String version) {this.version = version;}public String getDescription() {return description;}public void setDescription(String description) {this.description = description;}
}
  • 这里,prefix = "app" 表示将以 app. 开头的属性绑定到 AppConfig 类的相应属性上。

构造函数绑定

        从 Spring Boot 2.2 开始,支持使用构造函数绑定,这提供了一种更具类型安全性的配置绑定方式。例如:

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.ConstructorBinding;
import org.springframework.stereotype.Component;@Component
@ConstructorBinding
@ConfigurationProperties(prefix = "myconfig")
public class MyConfigBean {private final String name;private final int age;public MyConfigBean(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public int getAge() {return age;}
}
  • 这种方式使用构造函数注入,使得属性一旦初始化就不能修改,增强了代码的安全性和可维护性。

JSON应用程序属性

        由于环境变量和系统属性在命名上存在限制,某些属性名无法使用。为解决这一问题,Spring Boot 支持将一组属性编码为单个 JSON 结构。在应用程序启动时,Spring Boot 会自动解析spring.application.json 或 SPRING_APPLICATION_JSON 属性,并将其添加到应用的Environment中。

  • 设置 JSON 属性的方式:

    • 作为环境变量在命令行设置:在 UN*X shell 中,可通过设置 SPRING_APPLICATION_JSON环境变量来提供 JSON 数据。例如:

      • $SPRING_APPLICATION_JSON='{"my":{"name":"test"}}' java -jar myapp.jar

      • 最终在 Spring 环境中会得到my.name=test的属性。

    • 作为系统属性设置:可通过-D参数将spring.application.json作为系统属性来设置 JSON 数据。例如:

      • $ java -Dspring.application.json='{"my":{"name":"test"}}' -jar myapp.jar

    • 作为命令行参数设置:可在运行java -jar命令时,通过--spring.application.json参数来设置 JSON 数据。例如:

      • $ java -jar myapp.jar --spring.application.json='{"my":{"name":"test"}}'

    • 在经典应用服务器中通过 JNDI 变量设置:如果将应用部署到经典应用服务器,可以使用名为java:comp/env/spring.application.json的 JNDI 变量来提供 JSON 数据。

命令行参数

         默认情况下,SpringApplication将任何命令行选项参数(即以--开头的参数,例如--server.port=9000)转换为property并将它们添加到 Spring Environment。如前所述,命令行属性始终优先于基于文件的属性源。

        如果您不想将命令行属性添加到Environment,则可以禁用它们。

SpringApplication.setAddCommandLineProperties(false)

配置加载拓展

 @ConstructorBinding

  • @ConstructorBinding 是 Spring Framework 中的一个注解,它用于指示 Spring 在创建 bean 实例时使用带注解的构造函数进行依赖注入。

  • @ConstructorBinding 通常与 @ConfigurationProperties 注解结合使用,用于定义外部配置属性如何映射到配置类的字段上。

  • 注意事项

    • 这个注解在 Spring Boot 2.2 版本开始引入。

    • 当使用 @ConstructorBinding 时,构造函数中的所有参数都必须在配置文件中有对应的值,否则 Spring 将无法创建 bean 实例。

    • @ConstructorBinding 不支持字段注入,所有依赖都必须通过构造函数注入

@DefaultValue

        在加载属性值的过程中,构造函数参数可以使用@DefaultValue给属性指定默认值

	public MyProperties(boolean enabled, InetAddress remoteAddress, @DefaultValue Security security) {this.enabled = enabled;this.remoteAddress = remoteAddress;this.security = security;}

YAML 映射到属性的扁平化处理

        YAML 映射扁平化处理是将嵌套的 YAML 结构转换为平面结构的过程,即将多层次的键值对转换为单一层次的键值对。这在某些情况下很有用,特别是当你需要将 YAML 配置文件中的信息转换为环境变量或其他简单的键值存储时。

  • 以下是一个YAML 文件示例:

environments:dev:url: "https://dev.example.com"name: "Developer Setup"prod:url: "https://another.example.com"name: "My Cool App"
  • 为了从Environment访问这些属性,在经过扁平化处理后,等同于:

environments.dev.url=https://dev.example.com
environments.dev.name=Developer Setup
environments.prod.url=https://another.example.com
environments.prod.name=My Cool App

接收YAML 的List 类型属性

  • list 类型的 yml 配置如下所示:

myapp:nestedConfig:list:- subItem1- subItem2
  • 在经过扁平化处理后,等同于:

myapp.nestedConfig.list[0]=subItem1
myapp.nestedConfig.list[1]=subItem2
  • 使用该[index]符号的属性可以绑定到 Java List 或 Set使用 Spring Boot BInder类的对象。

接收YAML 的Map 类型属性

  • map 类型的yml 配置如下所示:

  • 绑定到Map属性时,您可能需要使用特殊的括号表示法,以便key保留原始值。如果键没有被 []包围,则任何非字母数字的字符-.都会被删除。

  • 对于 YAML 文件,括号需要用引号括起来,以便正确解析键。

myapp:nestedConfig:map:"[/subKey1]": "subValue1""[/subKey2]": "subValue1"
  • 在经过扁平化处理后,等同于:

myapp.nestedConfig.map[/subkey1]=subValue1
myapp.nestedConfig.map[/subkey2]=subValue2
  • 最后给出关于接收List 和Map 映射的Java 配置类的代码示例:

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map;@Component
@ConfigurationProperties(prefix = "myapp.nestedConfig")
public class NestedConfig {private Map<String, String> map;private List<String> list;public Map<String, String> getMap() {return map;}public void setMap(Map<String, String> map) {this.map = map;}public List<String> getList() {return list;}public void setList(List<String> list) {this.list = list;}
}

配置引入方式

spring.config.name 

        如果您不喜欢application配置文件名,可以通过指定spring.config.name环境属性切换到其他文件名。例如,要查找myproject.propertiesmyproject.yaml文件,您可以按如下方式运行应用程序:

$ java -jar myproject.jar --spring.config.name=myproject

Spring.config-location

         您还可以使用环境属性spring.config.location来引用明确的位置。此属性接受要检查的一个或多个位置的逗号分隔列表。

  • Spring.config-location用于指定 Spring Boot 应用程序的配置文件的位置。

  • 它会覆盖 Spring Boot 的默认配置文件搜索路径。当你使用 spring.config.location 时,Spring Boot 将只从你指定的位置查找配置文件,而不会再去查找默认的位置(如 classpath:/classpath:/config/file:./file:./config/)。

  • 可以指定多个位置,用逗号分隔,且会按顺序加载,后面的配置会覆盖前面的配置。

  • 命令行参数配置

java -jar myapp.jar --spring.config.location=classpath:/custom-config/,file:/etc/myapp/
  • 代码配置方式

import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class MyAppApplication implements CommandLineRunner {public static void main(String[] args) {SpringApplication app = new SpringApplication(MyAppApplication.class);app.setDefaultProperties(Collections.singletonMap("spring.config.location", "classpath:/custom-config/,file:/etc/myapp/"));app.run(args);}@Overridepublic void run(String... args) throws Exception {// 应用程序逻辑}
}

Spring.config.additional-location

  • 功能

    • 用于添加额外的配置文件位置,而不是替代默认的配置文件搜索路径。

    • Spring Boot 会先在默认位置查找配置文件,然后再到你指定的额外位置查找。这样可以在不影响 Spring Boot 原有的配置文件搜索逻辑的前提下,添加新的配置文件来源。

    • 同样可以指定多个位置,用逗号分隔,且会按顺序加载,后面的配置会覆盖前面的配置。

  • 命令行参数配置

java -jar myapp.jar --spring.config.additional-location=classpath:/extra-config/,file:/etc/myapp/extra/
  • 代码配置

import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import java.util.Collections;@SpringBootApplication
public class MyAppApplication implements CommandLineRunner {public static void main(String[] args) {SpringApplication app = new SpringApplication(MyAppApplication.class);app.setDefaultProperties(Collections.singletonMap("spring.config.additional-location", "classpath:/extra-config/,file:/etc/myapp/extra/"));app.run(args);}@Overridepublic void run(String... args) throws Exception {// 应用程序逻辑}
}

Spring.config.import

  spring.config.import 为 Spring Boot 应用程序提供了一种灵活且强大的配置导入机制,支持从多种来源导入配置,包括本地文件、类路径和配置服务器。它允许同时导入多个配置,且支持配置的覆盖和动态更新,为配置管理带来了更多的便利性和可扩展性,特别是在使用 Spring Cloud Config 进行集中式配置管理时,它是实现动态配置管理的重要手段之一。你可以根据应用程序的实际情况和需求,灵活运用该属性,更好地管理和更新配置信息。

        使用 spring.config.import 时,需要注意配置的顺序和来源,确保配置的正确性和一致性,同时要根据不同的部署环境和需求合理选择配置的导入来源,以实现最佳的配置管理效果。

与 Spring Cloud Config 的结合使用

  • 当使用 Spring Cloud Config 时,spring.config.import 可以方便地与配置服务器进行集成:

    • 你可以将配置服务器的地址添加到 spring.config.import 中,Spring Boot 会从配置服务器中拉取配置信息,并且会根据应用程序的 spring.application.name 和 spring.profiles.active 等属性来拉取特定的配置。

  • 配置示例:

spring.application.name=myapp
spring.profiles.active=dev
spring.config.import=configserver:http://configserver.example.com:8888
  • 上述配置将使 Spring Boot 从 http://configserver.example.com:8888 拉取 myapp-dev.properties 或 myapp-dev.yml 等相应的配置文件。

配置文件相关语法

可选的配置

  • 如果您想指定一个位置,但不介意它并不总是存在,则可以使用optional:前缀。您可以将此前缀与spring.config.locationspring.config.additional-location属性以及spring.config.import声明一起使用。

  • 默认情况下,当指定的配置数据位置不存在时,Spring Boot 将抛出一个错误ConfigDataLocationNotFoundException,并且您的应用程序将无法启动。

  • 配置示例:

$ java -jar myproject.jar --spring.config.location=\optional:classpath:/default.properties,\optional:classpath:/override.properties

通配符

  • 如果配置文件位置包含*最后一个路径段的字符,则该位置被视为位置通配符。加载配置时会展开通配符,以便还会检查直接子目录。当存在多个配置属性源时,位置通配符在 Kubernetes 等环境中特别有用。

  • 例如,如果您有一些 Redis 配置和一些 MySQL 配置,您可能希望将这两部分配置分开,同时要求它们都存在于一个application.properties文件中。这可能会导致两个单独的application.properties文件安装在不同的位置,例如/config/redis/application.properties/config/mysql/application.properties。在这种情况下,使用位置通配符config/*/,将导致两个文件都被处理。

  • 默认情况下,Spring Boot 包含config/*/默认搜索位置。这意味着/config将搜索 jar 之外的目录的所有子目录。

  • 您可以自己将通配符位置与spring.config.locationspring.config.additional-location属性结合使用。

  • 通配符位置仅适用于外部目录。您不能在classpath:位置中使用通配符。

属性占位符

  • application.propertiesapplication.yaml中的值在使用时会通过现有值进行过滤,因此您可以引用之前定义的值(例如,来自系统属性或环境变量)。标准属性占位符语法${name}可以在值中的任何位置使用。

  • 属性占位符还可以使用:来指定默认值,以:将默认值与属性名称分开,例如。${name:default}。以下示例展示了带有和不带有默认值的占位符的使用:

app.name=MyApp
app.description=${app.name} is a Spring Boot application written by ${username:Unknown}

  • 您应该始终使用其规范形式(仅使用小写字母的 kebab-case)引用占位符中的属性名称。

多文档分割处理

  • 对于application.properties文件,可以使用特殊 #---或 !--- 注释来标记文档分割:
spring.application.name=MyApp
#---
spring.application.name=MyCloudApp
spring.config.activate.on-cloud-platform=kubernetes

配置系统环境属性

  • 在使用 Spring Boot 时,你可能会遇到多个 Spring Boot 应用程序共享同一系统环境的情况,而这些应用程序可能有不同的配置需求。为了避免不同应用程序的配置属性之间发生混淆或冲突,Spring Boot 支持为系统环境属性设置前缀。

  • 系统环境属性通常是通过操作系统的环境变量来设置的,例如在 Linux 系统中使用 export 命令,在 Windows 系统中使用 set 命令。

  • 可以直接在 SpringApplication 上设置系统环境属性的前缀。这样做的好处是可以将环境属性进行隔离,确保不同应用程序使用不同的前缀,防止命名冲突。

  • 例如,如果你设置了前缀为 input,那么一个原本名为 remote.timeout 的属性在系统环境中会被解析为 input.remote.timeout。这意味着 Spring Boot 应用程序在查找 remote.timeout 这个配置属性时,会首先查找带有前缀的 input.remote.timeout 环境变量。

使用示例
  • 我们先设置一个环境变量(windows系统)

set input.remote.timeout=5000
  • 而后,我们在Spring Boot 启动类设置系统环境属性的前缀

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;@SpringBootApplication
public class MySpringBootApp {public static void main(String[] args) {SpringApplication app = new SpringApplicationBuilder(MySpringBootApp.class).properties("spring.config.name:myapp", "spring.config.location:/config/").build();// 设置系统环境属性的前缀app.setEnvironmentPrefix("input");app.run(args);}
}
  • 通过调用 setEnvironmentPrefix 方法将环境属性的前缀设置为 input。这样,当 Spring Boot 应用程序查找环境属性时,会自动添加这个前缀。例如,如果你在系统环境中设置了一个环境变量 input.remote.timeout=5000,Spring Boot 应用程序会将其作为 remote.timeout 属性的值。

  • 使用环境属性示例:

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;@Component
@ConfigurationProperties(prefix = "remote")
public class RemoteConfig {private int timeout;public int getTimeout() {return timeout;}public void setTimeout(int timeout) {this.timeout = timeout;}
}
  • 这样RemoteConfig 中的timeout 属性最终将会从环境变量input.remote.timeout 中取值。

配置文件的使用

配置激活

        有时spring.config.activate.* 仅在满足特定条件时激活一组给定的属性会很有用。例如,您可能拥有仅在特定配置文件处于活动状态时才相关的属性。您可以有条件地使用激活属性。

  •         激活属性说明:
属性说明

on-profile

必须与文档匹配的配置文件表达式才能使文档处于活动状态。

on-cloud-platform

必须检测CloudPlatform到才能使文档处于活动状态。

        例如,以下内容指定第二个文档仅在 Kubernetes 上运行时才处于活动状态,并且仅当“prod”或“staging”配置文件处于活动状态时:

myprop=always-set
#---
spring.config.activate.on-cloud-platform=kubernetes
spring.config.activate.on-profile=prod | staging
myotherprop=sometimes-set

导入无拓展名的文件

        某些云平台无法为卷挂载文件添加文件扩展名。要导入这些无扩展名的文件,您需要向 Spring Boot 提供提示,以便它知道如何加载它们。您可以通过将扩展名提示放在方括号中来实现这一点。

        例如,假设您有一个/etc/config/myconfig希望以 yaml 形式导入的文件。您可以application.properties使用以下命令从您的导入它:

spring.config.import=file:/etc/config/myconfig[.yaml]

配置随机值

        RandomValuePropertySource 对于注入随机值(例如,注入机密或测试用例)很有用。它可以生成整数、长整型、uuid 或字符串,如以下示例所示:

my:secret: "${random.value}"number: "${random.int}"bignumber: "${random.long}"uuid: "${random.uuid}"number-less-than-ten: "${random.int(10)}"number-in-range: "${random.int[1024,65536]}"

Spring Boot 自动配置

  • 开启自动配置:Spring Boot 开启自动配置的条件是使用@SpringBootApplication 或 @EnableAutoConfiguration。其中@SpringBootApplication 包含 @EnableAutoConfiguration。

  • 禁用特定的自动配置:如果您发现应用中存在不想要的特定自动配置类,则可以使用@SpringBootApplication 中的排除属性来禁用它们,如下例所示:
    @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
    public class MyApplication {}
    • 如果类不在类路径上,则可以使用excludeName注释的属性并指定完全限定名称。
    • @EnableAutoConfiguration 同样包含exclude 和 excludeName 属性
    • 您还可以使用配置文件属性 spring.autoconfigure.exclude 来控制要排除的自动配置列表。

查询自动配置详细说明

        我们可以在启动Jar 包时,加入 -Ddebug 来查看Spring Boot 自动配置的内容。在IDEA 中,我们可以直接选择启动配置项 Enable debug output来开启Spring Debug日志,从而查看自动配置的详细说明。

@Enable*注解

        在Spring Boot中,以@Enable*开头的注解通常用于开启特定的功能或配置。这些注解可以用来激活Spring框架中的某些特性,或者集成第三方库。以下是一些常见的@Enable开头的注解:

  • @EnableConfigurationProperties 是 Spring Boot 提供的一个注解,用于激活配置属性的支持。这个注解可以让你将外部配置(例如来自 application.propertiesapplication.yml 文件的配置)绑定到一个或多个 Java 类中,这些类通常被称为配置属性类。

  • @EnableAutoConfiguration:启用Spring Boot的自动配置机制,尝试根据类路径中的依赖自动配置Spring应用。

  • @EnableTransactionManagement:启用基于注解的事务管理功能。

  • @EnableScheduling:启用计划任务的支持,允许使用@Scheduled来标记计划执行的方法。

  • @EnableCaching:启用缓存支持,允许使用如@Cacheable等注解来进行方法级别的缓存。

  • @EnableAspectJAutoProxy:启用对AspectJ代理的支持,这通常意味着会为AOP(面向切面编程)提供支持。

  • @EnableAsync:启用异步方法执行,允许使用@Async来标记那些应该异步执行的方法。

  • @EnableJpaRepositories:与Spring Data JPA一起使用,用于指定仓库接口的位置,并启用JPA存储库支持。

  • @EnableWebMvc:当需要完全控制Spring MVC的配置时使用,它禁用Spring Boot的默认MVC配置。

  • @EnableDiscoveryClient:此注解用于激活Spring Cloud的发现客户端功能。它使得应用程序能够注册到服务注册中心(如Eureka, Consul, or Zookeeper),并且也能够从服务注册中心获取其他服务的位置信息。这有助于实现服务之间的动态查找和通信。使用该注解后,应用将自动配置为服务注册与发现的客户端,并且可以利用DiscoveryClient接口来查询服务实例。

  • @EnableFeignClients:此注解用于开启Feign声明式HTTP客户端的支持。

参考文献

Externalized Configuration :: Spring Boot

Configuration Classes :: Spring Boot

Auto-configuration :: Spring Boot

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/68705.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一款功能强大的互联网资产测绘引擎-CyberEdge

声明&#xff01;本文章所有的工具分享仅仅只是供大家学习交流为主&#xff0c;切勿用于非法用途&#xff0c;如有任何触犯法律的行为&#xff0c;均与本人及团队无关&#xff01;&#xff01;&#xff01; 目录标题 CyberEdge简洁而强大的互联网资产测绘工具核心特性搭建指南快…

细说STM32F407单片机电源低功耗StopMode模式及应用示例

目录 一、停止模式基础知识 1、进入停止模式 2、停止模式的状态 3、退出停止模式 4、SysTick定时器的影响 二、停止模式应用示例 1、示例功能和CubeMX项目配置 &#xff08;1&#xff09;时钟 &#xff08;2&#xff09;RTC &#xff08;3&#xff09;ADC1 &#xf…

【三国游戏——贪心、排序】

题目 代码 #include <bits/stdc.h> using namespace std; using ll long long; const int N 1e510; int a[N], b[N], c[N]; int w[4][N]; int main() {int n;cin >> n;for(int i 1; i < n; i)cin >> a[i];for(int i 1; i < n; i)cin >> b[i…

[Qt]事件-鼠标事件、键盘事件、定时器事件、窗口改变事件、事件分发器与事件过滤器

目录 前言&#xff1a;Qt与操作系统的关系 一、Qt事件 1.事件介绍 2.事件的表现形式 常见的Qt事件&#xff1a; 常见的事件描述: 3.事件的处理方式 处理鼠标进入和离开事件案例 控件添加到对象树底层原理 二、鼠标事件 1.鼠标按下和释放事件&#xff08;单击&#x…

【优选算法】----移动零

好久没写博客的兄弟姐妹们~ 今天来写一篇算法过过水吧~ --------------------------------------begin---------------------------------------- 题目要求&#xff1a; 给的难度是简单哦 题目解析&#xff1a; 这道题的思路可以借助双指针的思想&#xff0c;定义dest和c…

Java设计模式—观察者模式

观察者模式 目录 观察者模式1、什么是观察者模式&#xff1f;2、观察者模式优缺点及注意事项&#xff1f;3、观察者模式实现&#xff1f;4、手写线程安全的观察者模式&#xff1f; 1、什么是观察者模式&#xff1f; - 实例&#xff1a;现实生活中很多事物都是依赖存在的&#x…

WGAN - 瓦萨斯坦生成对抗网络

1. 背景与问题 生成对抗网络&#xff08;Generative Adversarial Networks, GANs&#xff09;是由Ian Goodfellow等人于2014年提出的一种深度学习模型。它包括两个主要部分&#xff1a;生成器&#xff08;Generator&#xff09;和判别器&#xff08;Discriminator&#xff09;…

Qt 5.14.2 学习记录 —— 십칠 窗口和菜单

文章目录 1、Qt窗口2、菜单栏设置快捷键添加子菜单添加分割线和菜单图标 3、工具栏 QToolBar4、状态栏 QStatusBar5、浮动窗口 QDockWidget 1、Qt窗口 QWidget&#xff0c;即控件&#xff0c;是窗口的一部分。在界面中创建控件组成界面时&#xff0c;Qt自动生成了窗口&#xf…

SpringCloud系列教程:微服务的未来(十四)网关登录校验、自定义过滤器GlobalFilter、GatawayFilter

前言 在微服务架构中&#xff0c;API 网关扮演着至关重要的角色&#xff0c;负责路由请求、执行安全验证、流量控制等任务。Spring Cloud Gateway 作为一个强大的网关解决方案&#xff0c;提供了灵活的方式来实现这些功能。 本篇博客将重点介绍如何在 Spring Cloud Gateway 中…

Redis源码-redisObject

解释 redis中&#xff0c;所有的数据类型最终都转换成了redisObject&#xff0c;该结构体的定义&#xff0c;在文件server.h中。 参数说明 参数名说明unsigned type:4对象对应的数据类型unsigned encoding:4对象的编码方式unsigned lru:LRU_BITSLRU算法清空对象&#xff0c…

为什么相关性不是因果关系?人工智能中的因果推理探秘

目录 一、背景 &#xff08;一&#xff09;聚焦当下人工智能 &#xff08;二&#xff09;基于关联框架的人工智能 &#xff08;三&#xff09;基于因果框架的人工智能 二、因果推理的基本理论 &#xff08;一&#xff09;因果推理基本范式&#xff1a;因果模型&#xff0…

兼职全职招聘系统架构与功能分析

2015工作至今&#xff0c;10年资深全栈工程师&#xff0c;CTO&#xff0c;擅长带团队、攻克各种技术难题、研发各类软件产品&#xff0c;我的代码态度&#xff1a;代码虐我千百遍&#xff0c;我待代码如初恋&#xff0c;我的工作态度&#xff1a;极致&#xff0c;责任&#xff…

js重要知识点

目录 一、冒泡排序的计算方法 二、数组forEach方法 三、Number(null)和Number(undefined) 四、es6中的set 一、冒泡排序的计算方法 冒泡排序的重点:两次循环&#xff0c;外层循环是总共要进行的躺数,为数组总长度-1,内层循环则是每个元素在每一次循环中需要比较的次数&#xff…

Chrome 132 版本新特性

Chrome 132 版本新特性 一、Chrome 132 版本浏览器更新 1. 在 iOS 上使用 Google Lens 搜索 在 Chrome 132 版本中&#xff0c;开始在所有平台上推出这一功能。 1.1. 更新版本&#xff1a; Chrome 126 在 ChromeOS、Linux、Mac、Windows 上&#xff1a;在 1% 的稳定版用户…

2024微短剧行业生态洞察报告汇总PDF洞察(附原数据表)

原文链接&#xff1a; https://tecdat.cn/?p39072 本报告合集洞察从多个维度全面解读微短剧行业。在行业发展层面&#xff0c;市场规模与用户规模双增长&#xff0c;创造大量高收入就业岗位并带动产业链升级。内容创作上&#xff0c;精品化、品牌化趋势凸显&#xff0c;题材走…

基于GRU实现股价多变量时间序列预测(PyTorch版)

前言 系列专栏:【深度学习:算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域,讨论了各种复杂的深度神经网络思想,如卷积神经网络、循环神经网络、生成对抗网络、门控循环单元、长短期记…

Python基于Django的社区爱心养老管理系统设计与实现【附源码】

博主介绍&#xff1a;✌Java老徐、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&…

基于OpenCV和Python的人脸识别系统_django

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 管理员登录 管理员功能界面 用户管理 公告信息管理 操作日志管理 用户登录界面 用户…

吴恩达深度学习——神经网络编程的基础知识

文章内容来自BV11H4y1F7uH&#xff0c;仅为个人学习所用。 文章目录 二分分类一些符号说明 逻辑斯蒂回归传统的线性回归函数 y ^ w T x b \hat{y}w^T\boldsymbol{x}b y^​wTxbSigmoid激活函数逻辑斯蒂回归损失函数损失函数成本函数与损失函数的关系 梯度下降法计算图逻辑斯蒂…

调试Hadoop源代码

个人博客地址&#xff1a;调试Hadoop源代码 | 一张假钞的真实世界 Hadoop版本 Hadoop 2.7.3 调试模式下启动Hadoop NameNode 在${HADOOP_HOME}/etc/hadoop/hadoop-env.sh中设置NameNode启动的JVM参数&#xff0c;如下&#xff1a; export HADOOP_NAMENODE_OPTS"-Xdeb…