<返回更多

Spring boot 配置类与配置文件详解

2019-10-08    
加入收藏
Spring boot 配置类与配置文件详解

 

前言

在现今Spring boot 流行年代,相信大部人都非常喜欢Spring boot简洁而非常有效的配置,让我们从庞大xml配置解放出来,让每个框架都需要手动配置集成的劳动中解放出来。这一切都是spring Boot基于约定优于配置的思想,大量的减少了配置文件的使用。

@SpringBootApplication注解

一个简单的@SpringBootApplication注解可以试下这那三个功能:

Spring boot的配置类

Spring boot 偏好于基于JAVA类的配置,尽管SpringApplication也可以和XML配置一起使用,但是Spring boot建议我们的配置写在单个 @Configuration 注解的类中,通常,Spring boot 官方声称定义主方法的类作为主@configuration是一个很好的选择。但我们也可以根据我们的业务需要写多个@configuration,比如说 数据库连接配置一个 @configuration,线程池配置一个 @configuration等等

导入配置类

我们不需要将所有@configuration放到一个类中。@import注解可用于导入其他配置类。或者,您可以使用@components can自动扫描所有Spring组件,包括@configuration类。

@SpringBootApplication
@Import({LinkConfig.class, ConnectionPoolConfig.class, HttpConfig.class, CuratorConfig.class, GlobalConfig.class})
public class ExampleController 

导入xml配置

如果你一定要使用基于xml的配置,建议仍然从@configuration类开始。然后可以使用@ImportResource注解加载XML配置文件

SpringBootApplication
@ImportResource("classpath:*.xml")
public class ExampleController 

自动配置

Spring Boot自动配置功能会尝试根据你添加的JAR依赖项自动配置您的Spring应用程序。例如,如果hsqldb在你的类路径上,并且你没有手动配置任何数据库连接bean,那么spring boot会自动为你配置一个内存数据库。

你只需要选择自动配置,方法是将@EnableAutoconfiguration或@SpringBootApplication注释添加到您的@configuration类中。

注意:你应该只添加一个@SpringBootApplication或@EnableAutoconfiguration注解。我们通常建议您只向主要@configuration类添加一个注解(主要configuration 是带main方法的启动类)

自动化配置是非侵入式的,在任何一个点上,你可以定义你自己的配置去替换 auto-configuration 引入的配置。例如,你添加了自己的数据源配置,则auto-configuration 带进来的数据配置将会无效。

禁用部分自动配置类

如果你发现一些不想应用的特定自动配置类,可以使用@EnableAutoconfiguration的exclude属性禁用它们,如下例所示:

@Configuration
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
public class ExampleController 

Spring boot 的配置文件

Spring boot允许将配置外部化,以便应用程序代码在不同的环境中使用不同的配置。可以使用properties文件、yaml文件、环境变量和命令行参数来外部化配置。属性值可以通过使用@value注解直接注入bean,通过Spring的环境抽象访问,或者通过@ConfigurationProperties绑定到结构化对象。

Spring Boot使用一个非常特殊的属性源顺序,这样设计是为了个这些配置一个优先级,以便于进行的合理覆盖。属性按以下顺序:

  1. 主目录上的devtools全局设置属性(~/.spring-boot-devtools.properties,当devtools处于活动状态时)
  2. @TestPropertySource 注解在你的测试代码上
  3. @SpringBootTest 注解上的属性值在测试代码上,测试应用程序特殊部分的测试注解
  4. 命令行参数
  5. 来自于SPRING_APPLICATION_JSON 的参数属性值,(嵌入在环境变量或系统属性中的内联JSON)
  6. ServletConfig 初始化的参数
  7. ServletContext 初始化参数
  8. 来自 java:comp/env 的JNDI 属性值
  9. Java System 的属性(System.getProperties())
  10. 系统环境变量
  11. 仅在RandomValuePropertySource*中具有属性的RandomValuePropertySource。
  12. 在打包的JAR之外配置特定的Profile-specific.properties(application-{profile}.properties 和yaml 文件)
  13. 在打包的JAR里面配置特定的Profile-specific.properties(application-{profile}.properties 或yaml 文件)
  14. 在打包的JAR之外的 application.properties或yaml 文件
  15. 在打包的JAR里面的 application properties(application.properties 或yaml 文件)
  16. @PropertySource注解在你的 @Configuration 配置类上
  17. 默认属性(通过设置SpringApplication.setDefaultProperties指定)

下面举个例子,假如你开发了一个使用name属性的@component,如下例所示:

@Component
 public class ComBean {
 @Value("${name}")
 private String name;
 }

在应用程序classpath路径(例如,在JAR中)上,可以有一个application.properties文件,该文件为name提供了一个合理的默认属性值。在新环境中运行时,可以在jar外部提供application.properties文件来覆盖name 属性。对于一次性测试,您可以使用特定的命令行开关(例如java –jar app.jar --name=”String”)启动。

在前面的示例中,您将在Spring环境中得到name=test。您还可以在系统属性中以spring.application.json的形式提供json,如下例所示:

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

还可以使用命令行参数提供JSON,如下例所示:

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

RandomValuePropertySource配置随机数

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

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

访问命令行参数

默认情况下,SpringApplication会将任何命令行选项参数(即以-开头的参数,例如--server.port=9000)转换为属性,并将其添加到Spring环境中。如前所述,命令行属性总是优先于其他属性源。

如果不希望将命令行属性添加到环境中,可以使用

SpringApplication.setAddCommandLineProperties(false)

Application 属性文件

SpringApplication从以下位置的application.properties文件加载属性,并将其添加到Spring环境中:

  1. 当前目录的 /config 子目录
  2. 当前目录
  3. classpath 的 /config 包
  4. classpath 的根目录

3 和 4 是实际项目应用比较常见

列表按优先级排序(在列表中较高位置定义的属性覆盖在较低位置定义的属性)。

如果不喜欢application.properties作为配置文件名,可以通过指定spring.config.name环境属性切换到另一个文件名。还可以使用spring.config.location环境属性(目录位置或文件路径的逗号分隔列表)引用显式位置。以下示例显示如何指定其他文件名:

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

以下示例显示如何指定两个位置:

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

如果spring.config.location包含目录(与文件相反),那么它们应该以/结尾,并且在运行时,在加载之前,附加从spring.config.name生成的名称,包括特定文件的文件名)。spring.config.location中指定的文件按原样使用,不支持特定于概要文件的变量,并且被任何特定于概要文件的属性覆盖。

按相反的顺序搜索配置位置。默认情况下,配置的位置为classpath/、classpath:/config/、file:../、file:../config/。结果搜索顺序如下:

  1. file:./config/
  2. file:./
  3. classpath:/config/
  4. classpath:/

当使用spring.config.location配置自定义配置位置时,它们将替换默认位置。例如,如果spring.config.location配置了值classpath:/custom config/,file:/custom config/,则搜索顺序如下:

  1. file:./custom-config/
  2. classpath:custom-config/

或者,当使用spring.config.additional-location配置自定义配置位置时,除了默认位置外,还将使用这些位置。在默认位置之前搜索其他位置。例如,如果配置了classpath:/custom config/,file:/custom config/的其他位置,则搜索顺序如下:

  1. file:./custom-config/
  2. classpath:custom-config/
  3. file:./config/
  4. file:./
  5. classpath:/config/
  6. classpath:/

此搜索顺序允许您在一个配置文件中指定默认值,然后有选择地在另一个配置文件中覆盖这些值。您可以在默认位置的application.properties(或用spring.config.name选择的任何其他基名称)中为应用程序提供默认值。然后,可以在运行时使用位于其中一个自定义位置的其他文件覆盖这些默认值。

Profile-specific Properties

除了application.properties文件外,还可以使用以下命名约定定义特定于文件的属性:application-{profile}.properties。环境有一组默认配置文件(默认情况下为[default]),如果未设置活动配置文件,则使用这些默认配置文件。换句话说,如果没有显式激活配置文件,那么将加载application-default.properties中的属性。

配置文件特定的属性从与标准application.properties相同的位置加载,配置文件总是覆盖非特定的文件,无论配置文件是在打包的jar内还是在打包的jar外。

如果指定了多个配置文件,则应用最后一个胜利策略。例如,spring.profiles.active属性指定的配置文件将添加到通过SpringApplication API配置的配置文件之后,因此优先。

如果在spring.config.location中指定了任何文件,则不会考虑这些文件的特定于概要文件的变体。如果还想使用特定于概要文件的属性,请使用spring.config.location中的目录。

属性中的占位符

application.properties中的值在使用时通过现有环境进行过滤,因此您可以引用以前定义的值(例如,从系统属性)

app.name=MyApp
app.description=${app.name} is a Spring Boot application

Profiles

Spring配置文件提供了一种隔离应用程序配置部分的方法,使其仅在特定环境中可用。任何@component或@configuration在加载时都可以用@profile进行标记以限制,如下例所示:

@Configuration
@Profile("production")
public class ProductionConfiguration {
 // ...
}

可以使用spring.profiles.active 环境属性指定哪些配置文件处于活动状态。例如,您可以将其包含在application.properties中,如下例所示:

spring.profiles.active=dev,hsqldb

您还可以使用以下开关在命令行上指定它:--spring.profiles.active=dev,hsqldb。

添加活动profile

spring.profiles.active属性遵循与其他属性相同的顺序规则:最高的属性源获胜。这意味着您可以在application.properties中指定活动配置文件,然后可以使用命令行开关替换它们。

有时,将特定于概要文件的属性添加到活动概要文件中而不是替换它们是很有用的。spring.profiles.include属性可用于无条件添加活动配置文件。SpringApplication入口点也有一个Java API来设置附加的配置文件(也就是说,在spring.profiles.active属性激活的那些文件之上)。请参见SpringApplication中的setAdditionalProfiles()方法

例如,当使用开关-spring.profiles.active=prod运行具有以下属性的应用程序时,还会激活proddb和prodmq配置文件:

---
my.property: fromyamlfile
---
spring.profiles: prod
spring.profiles.include:
 - proddb
 - prodmq
声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多资讯 >>>