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 {

	@NotNull
	private 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 {

	@NotNull
	private InetAddress remoteAddress;

	@Valid
	private 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 {

		@NotEmpty
		private 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 {
    @Autowired
    private 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;

    @Autowired
    public 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;

    @Autowired
    public 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);
    }

    @Override
    public 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);
    }

    @Override
    public 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ElasticSearch JavaRestClient查询之快速入门

文章目录 查询操作流程概述构建并发起请求1. 创建请求对象2. 设置请求体3. 发送请求 查询结果的解析1. 解析结果结构2. 获取总条数3. 获取命中的数据 完整示例代码总结 查询操作流程概述 Elasticsearch 查询操作大致可以分为两个部分&#xff1a; 构建并发起请求&#xff1a;…

【C++】红黑树的应用(封装map和set)

✨ 青山一道同云雨&#xff0c;明月何曾是两乡 &#x1f30f; &#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;C学习 &#x1f680; 欢迎关注&#xff1a;&#x1f44d;点赞 &…

C# 给定欧氏平面中的一组线可以形成的三角形的数量

给定欧氏平面中的一组线可以形成的三角形的数量(Number of Triangles that can be formed given a set of lines in Euclidean Plane) 给定欧氏平面上的 n 条不同直线的集合 L {l 1 , l 2 , ………, l n }。第i 条直线由形式为 a i x b i y c i的方程给出。求出可以使用集合…

C++书籍 第一部分专业C++程序设计概述

1&#xff0c;必不可少的“hello world” #include<iostream>int main(int argc, char** argv) {std::cout << "hello world" << std::endl;return 0; } 这个是一个极其简单的程序&#xff0c;虽然没有多大简直&#xff0c;但是可以体现c程序格式方…

leetcode刷题记录(七十二)——146. LRU 缓存

&#xff08;一&#xff09;问题描述 146. LRU 缓存 - 力扣&#xff08;LeetCode&#xff09;146. LRU 缓存 - 请你设计并实现一个满足 LRU (最近最少使用) 缓存 [https://baike.baidu.com/item/LRU] 约束的数据结构。实现 LRUCache 类&#xff1a; * LRUCache(int capacity)…

微调时如何平衡新旧参数?

在微调预训练模型时&#xff0c;平衡新旧参数是一个重要的问题。合理地平衡新旧参数可以确保模型既保留预训练阶段学到的通用表示能力&#xff0c;又能够有效地适应特定任务。以下是一些常用的方法和技术来平衡新旧参数&#xff1a; ### 1. 学习率调整 **不同层使用不同的学习…

性能调优篇 四、JVM运行时参数

目录 一、三种JVM参数选项1、标准参数选项1&#xff09;特点2&#xff09;各种选项3&#xff09;-server 和 -client 2、-X参数选项3、-XX参数选项 二、添加JVM参数选项1、idea 如何添加jvm参数 三、常见的JVM参数选项1、打印设置的参数选项及其值2、堆、栈、方法区等内存大小设…

2024年博客之星主题创作|Android 开发:前沿技术、跨领域融合与就业技能展望

目录 引言 一、推动 Android 应用创新的核心力量 1.1 人工智能与机器学习的崛起 1.2 增强现实&#xff08;AR&#xff09;与虚拟现实&#xff08;VR&#xff09;的应用扩展 1.3 5G技术的推动 1.4 跨平台开发技术的成熟 1.4.1 React Native 1.4.2 Flutter 1.4.3 Taro …

汇编与逆向(一)-汇编工具简介

RadASM是一款著名的WIN32汇编编辑器&#xff0c;支持MASM、TASM等多种汇编编译器&#xff0c;Windows界面&#xff0c;支持语法高亮&#xff0c;自带一个资源编辑器和一个调试器。 一、汇编IDE工具&#xff1a;RadASM RadASM有内置的语言包 下载地址&#xff1a;RadASM asse…

Gin 源码概览 - 路由

本文基于gin 1.1 源码解读 https://github.com/gin-gonic/gin/archive/refs/tags/v1.1.zip 1. 注册路由 我们先来看一段gin代码&#xff0c;来看看最终得到的一颗路由树长啥样 func TestGinDocExp(t *testing.T) {engine : gin.Default()engine.GET("/api/user", f…

Linux网络序列化与反序列化

Linux网络序列化与反序列化 1. 前言 在网络通信中&#xff0c;互相通信的信息不一定都是字符串&#xff0c;往往一些结构化的信息也需要进行通信。理论上&#xff0c;只要服务器和客户端都自定义一个共同的协议&#xff0c;结构化的信息也能实现正常通信。但考虑到不同系统、…

实战经验:使用 Python 的 PyPDF 进行 PDF 操作

文章目录 1. 为什么选择 PyPDF&#xff1f;2. 安装 PyPDF3. PDF 文件的合并与拆分3.1 合并 PDF 文件3.2 拆分 PDF 文件 4. 提取 PDF 文本5. 修改 PDF 元信息6. PDF 加密与解密6.1 加密 PDF6.2 解密 PDF 7. 页面旋转与裁剪7.1 旋转页面7.2 裁剪页面 8. 实战经验总结 PDF 是一种非…

PhyCAGE:符合物理规律的图像到 3D 生成

Paper: Yan H, Zhang M, Li Y, et al. PhyCAGE: Physically Plausible Compositional 3D Asset Generation from a Single Image[J]. arXiv preprint arXiv:2411.18548, 2024. Introduction: https://wolfball.github.io/phycage/ Code: Unreleased PhyCAGE 是一种 image-to-3D…

游戏为什么失败?回顾某平庸游戏

1、上周玩了一个老鼠为主角的游戏&#xff0c;某平台喜1送的&#xff0c; 下载了很久而一直没空玩&#xff0c;大约1G&#xff0c;为了清硬盘空间而玩。 也是为了拔掉心中的一根刺&#xff0c;下载了而老是不玩总感觉不舒服。 2、老鼠造型比较写实&#xff0c;看上去就有些讨…

上位机工作感想-2024年工作总结和来年计划

随着工作年限的增增长&#xff0c;发现自己越来越不喜欢在博客里面写一些掺杂自己感想的东西了&#xff0c;或许是逐渐被工作逼得“成熟”了吧。2024年&#xff0c;学到了很多东西&#xff0c;做了很多项目&#xff0c;也帮别人解决了很多问题&#xff0c;唯独没有涨工资。来这…

Android系统开发(六):从Linux到Android:模块化开发,GKI内核的硬核科普

引言&#xff1a; 今天我们聊聊Android生态中最“硬核”的话题&#xff1a;通用内核镜像&#xff08;GKI&#xff09;与内核模块接口&#xff08;KMI&#xff09;。这是内核碎片化终结者的秘密武器&#xff0c;解决了内核和供应商模块之间无尽的兼容性问题。为什么重要&#x…

5G 核心网 相关概念快速入门

在我们开始阅读3GPP协议来学习5G核心网之前&#xff0c; 不妨来看看我之前整理的PPT&#xff0c;快速学习核心网相关概念&#xff0c; 以及5G转发面PFCP协议的相关核心知识。 涵盖了最精简的核心骨干内容&#xff0c;助你轻松上阵。 讲解目标 3GPP和相关协议 5G核心网架构模…

2025/1/20 学习Vue的第三天

玩性太大了玩得也不开心&#xff0c;天天看电视刷视频。 内心实在空洞。 最近天天看小红书上的外国人&#xff0c;结实外国友人&#xff08;狗头&#xff09;哈哈哈认识了不少人&#xff0c;有埃及的有美国的&#xff0c;还有天天看菲利普吃糖葫芦哈哈哈哈哈一个阳光的德国大男…

虚幻基础1:hello world

能帮到你的话&#xff0c;就给个赞吧 &#x1f618; 文章目录 hello world创建项目创建关卡创建蓝图将蓝图插入关卡中运行 hello world 本文引擎为5.5.1 创建项目 如图 创建后如图。 创建关卡 如图 创建蓝图 如图 选择actor 双击进入蓝图节点 选择事件图表 创…

SAP POC 项目完工进度 - 收入确认方式【工程制造行业】【新准则下工程项目收入确认】

1. SAP POC收入确认基础概念 1.1 定义与原则 SAP POC&#xff08;Percentage of Completion&#xff09;收入确认方式是一种基于项目完工进度来确认收入的方法。其核心原则是根据项目实际完成的工作量或成本投入占预计总工作量或总成本的比例&#xff0c;来确定当期应确认的收…