Spring Boot application.properties文件配置说明

x33g5p2x  于2022-09-16 转载在 Spring  
字(7.2k)|赞(0)|评价(0)|浏览(689)

在这篇Spring Boot文章中,我们将研究***application.properties文件的***。我们将看一下在Spring Boot中使用***属性的不同选项。

简介

Spring Boot使用application.properties文件为应用程序的配置提供了一个强大而灵活的机制。这种机制提供了配置和改变应用程序行为的灵活性,而无需改变我们应用程序中的代码。默认的application.properties文件中包含了大量的配置,以引导我们的应用程序。Spring Boot提供了一个选项,可以通过覆盖这些配置属性来改变或覆盖应用程序的行为。

它还提供了一个强大的机制,使用application.properties文件在我们的应用程序中注入自定义属性。关于OOTB属性的完整列表,请参考documentation。这篇文章包括如何定义自定义属性以及如何在我们的应用程序中使用这些自定义属性。

1.application.properties文件

application.properties文件是一个简单的属性文件,包含一个键值信息,用于配置或外化我们的应用程序属性。Spring Boot提供了多种选择,以在应用程序中捆绑该文件。

  1. 将其与jar捆绑在一起。
  2. 启动时从文件系统中加载。

把属性文件看作是你的应用程序的中央控制单元。这个文件在以下方面很有用。

  1. 自定义或覆盖默认的Spring框架行为(例如,改变服务器端口,或超时或缓存)。
  2. 自定义属性来控制我们的应用程序(为API集成定义用户名和密码)。

2. 设置应用程序

让我们通过创建一个简单的Web应用程序来开始我们的旅程。我们可以使用IDE或Spring Initializr来启动我们的应用程序。

点击 "生成 "按钮,在你的本地机器上下载项目结构。下一步是在Java编辑器中导入该项目。我们的Spring Boot配置文件将在src/main/resources目录下可用。

默认情况下,这个文件将是空的(我们将在后面的部分添加数值)。Spring也支持使用.yml文件进行属性配置。如果你喜欢.yml,请在同一文件位置创建application.yml文件。我们在本教程中使用的是.properties类型。

[pullquote align="normal"]不要混合属性和yml惯例。选择一个并坚持下去。[/pullquote]

让我们在application.properties文件中添加一个自定义属性。

javadevjournal.welcome.message= A warm greeting from Javadevjournal Team!!

3. 使用@Value注解进行属性注入

注入这些属性最常见的方式是通过@Value注释。我们可以选择在以下情况下使用这个注解

  1. 在构造函数中
  2. 在Bean字段上。

让我们创建一个REST控制器,为所有客户提供一个可配置的欢迎信息。

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class WelcomeController {

    // We are injecting the configuration message from the application.properties file using @Value annotation
    @Value("${javadevjournal.welcome.message}")
    private String welcomeMsg;

    /**
     * Our Welcome display message which will use the welcome message property injected through the
     * @Value annotation.welcome
     * @return welcome message
     */
    @GetMapping("/welcome")
    public String displayWelcomeMsg() {
        return welcomeMsg;
    }
}

当我们运行我们的应用程序时,我们的欢迎控制器将通过application.properties注解返回从@Value文件注入的属性。

3.1. 使用构造函数参数。

我们可以选择使用@Value注解来传递作为构造函数参数。让我们举个例子,我们想给构造函数传递一个默认值。

public void DefaultWelcomeService(@Value("${javadevjournal.init.secret.key}") String secretKey) {
    this.secretKey = secretKey;
    LOG.info("@Value annotation is working for our secret key {}", secretKey);
}

[pullquote align="normal"]如果Spring没有找到你要注入的键,它会抛出IllegalArgumentException [/pullquote]

Spring Boot很灵活,提供了一个选项来处理IllegalArgumentException的情况,以防该属性丢失。我们可以在application.properties文件中缺少该属性的情况下传递一个选项值。我们可以通过在键的后面加上colon (:)和默认值来传递默认值。

@Value("${javadevjournal.welcome.message: Welcome!!!}")
private String welcomeMsg;

4. 使用@ConfigurationProperties

如果我们的属性有一些共同的上下文,这个注解是有帮助的。考虑一下属性文件中的以下条目。

user.firstName = Demo
user.lastName = User
user.greeting = Hello Stranger
user.blogName = javadevjournal.com

如果我必须在Spring应用程序中使用这些属性文件。

public class SimpleSpringPropertyTest {
    @Value("${user.firstName}") private String firstName;
    @Value("${user.lastName}") private String lastName;
 }

@Value("${proprties}")注解很方便,也很容易使用,但如果我们有几个属性,这确实将是一个非常繁琐的过程。Spring Boot引入了@ConfigurationProperties注解,以更简洁的方式处理这些属性,并提供了验证这些配置值的选项。

#Database Configuration
db.driver =org.hsqldb.jdbcDriver
db.username =test
db.password =test
db.tablePrefix =_prefix
#SMTP Configuration
mail.from [email protected]
mail.host [email protected]
mail.port =25
mail.security.userName =test
mail.security.password =test
#Server Configurations
server.tomcat.httpPort =80
server.tomcat.sslPort =443
server.tomcat.ajpPort =444
server.tomcat.jmxPort =445

让我们看看如何在不注入单个属性的情况下设置电子邮件配置。

@Configuration
@ConfigurationProperties(prefix = "mail")
public class ApplicationConfigurationProp {

    private String from;
    private String host;
    private int port;

    //getter and setter

    public static class Security {
        private String userName;
        private String password;

        //getter and setter
    }
}

一旦我们运行上述应用程序,在属性文件中定义的所有属性与前缀 "mail"将自动绑定/分配给这个对象。阅读@ConfigurationProperties in Spring Boot了解更多细节。

5. 覆盖默认属性

要覆盖默认的application.properties文件中定义的属性,我们只需要在我们的项目配置文件中用自定义值来定义该属性。Spring Boot按照一定的顺序加载这些属性文件,它将确保项目application.properties文件中定义的配置优先使用。让我们举个例子,我们想改变Tomcat的默认端口,在项目配置文件中添加以下属性。

server.port = 8090

6. 属性文件中的多行

如果我们的属性有一个很长的值,我们可以添加反斜杠字符,将其分成多行,提高属性的整体可读性。让我们看看如何在application.properties文件中这样做。

javadevjournal.welcome.message= A warm and long greeting from Javadevjournal Team!! to show \
                                how we can use the backslash character to improve the overall \
                                readability of the file.

7. 自定义属性的类型转换

在application.properties文件中定义的所有属性都是String类型的(这是一个文本文件)。Spring框架附带了一长串的类型转换器,可以根据应用程序中声明的类型将字符串转换为其他类型。让我们看一下下面的例子。

javadevjournal.max.login.retry=3
javadevjournal.enable.guest.checkout=true

Spring会自动检测变量类型,并在注入前进行类型转换。

public void DefaultWelcomeService(@Value("${javadevjournal.init.secret.key}") String secretKey, @Value("${javadevjournal.max.login.retry}") int retry, @Value("${javadevjournal.enable.guest.checkout}") boolean enableGuestCheckout) {
    this.secretKey = secretKey;
    LOG.info("@Value annotation is working for our secret key {}", secretKey);
}

8. 应用程序.属性中的数组、列表、集合

在某些用例中,我们想为我们的应用程序定义一个值的集合。在application.properties文件中定义用逗号分隔的属性值。

javadevjournal.init.keys= 1,2,3,4,5,6

将类中的属性定义为List、Set或Array,Spring将为我们做自动转换。

@Value("${javadevjournal.init.keys}")
private int[] keys;

@Value("${javadevjournal.init.keys}")
private List < Integer > keyList;

/**
 * Our Welcome display message which will use the welcome message property injected through the
 * @Value annotation.welcome
 * @return welcome message
 */
@GetMapping("/welcome")
public String displayWelcomeMsg() {
    LOG.info("keys as integer array {}", keys);
    LOG.info("keys as integer list {}", keyList);
    return welcomeMsg;
}

下面是控制台的输出。

2020-02-17 11:10:39.560  INFO 87750 --- [nio-8080-exec-1] c.j.controller.WelcomeController         : keys as integer array [1, 2, 3, 4, 5, 6]
2020-02-17 11:10:39.563  INFO 87750 --- [nio-8080-exec-1] c.j.controller.WelcomeController         : keys as integer list [1, 2, 3, 4, 5, 6]
8.1. 属性文件中的自定义分隔符

当我们在application.properties文件中定义列表时,Spring Boot使用逗号作为默认分界符。框架提供了处理属性的选项,以防我们想对列表使用不同的分隔符。 

javadevjournal.init.keys= 1;2;3;4;5;6
@Value("#{'${javadevjournal.init.keys.new.delimiter}'.split(';')}")
 private List < Integer > newKeys;

这就是Spring EL的威力,它为我们做了这一招。Spring Boot将属性作为一个普通字符串注入。我们表达式中的split()方法分割了输入,最后被转换为Integer列表。

[pullquote align="normal"]没有命名规则,但强烈建议为你的自定义属性制定一个一致的命名规则。[/pullquote]

9. Spring Profiles (环境特定文件)

Spring Profiles提供了一种强大而简单的方式来控制基于环境的代码和配置。使用*Spring Profiles *可以隔离我们应用程序的部分内容,使其只在某些环境下可用。Spring Boot提供的最有趣、最强大的功能之一是能够定义特定于配置文件的application.properties文件,并通过主应用程序.properties文件激活这些文件。

为了使用特定的配置文件,我们需要使用application-{profile}.properties的命名惯例,其中profile定义了预期的配置文件的名称。它将从与 application.properties 文件相同的位置加载配置文件。

application-local.properties.
application-dev.properties
E1D29D1E
application-prod.propertiesapplication-prod.properties

你可以根据你的要求定义属性。使用spring.profiles.active属性来帮助Spring Boot为我们选择正确的配置。

spring.profiles.active=staging

我们正在将活动配置文件设置为staging。通过上述设置,除了主文件application.properties之外,Spring Boot还将加载application-staging.properties中定义的属性。更多细节,请阅读Spring Profiles

无论spring.profiles.active值如何,application.properties都会被加载。

10. 外部application.properties文件

当我们不想把属性放在jar里面的时候,情况会怎么样?以所有端点的用户名和密码为例。我们不想把这些敏感数据放在jar文件里,但我们又喜欢用同样的灵活性来改变配置而不改变代码库。

Spring Boot提供了一个选项,可以直接从运行时环境的文件系统中读取自定义属性文件。我们可以在服务器上存储这个自定义的application.properties文件,并通知Spring Boot在启动时加载这个文件。使用spring.config.additional-location属性来配置 

java -jar javadevjournal.jar -Dspring.config.additional-location="external_file_location"

总结

在这篇文章中,我们讨论了Spring Boot中的application.properties文件。我们看到了使用这个配置文件为我们的应用程序定义自定义属性的不同选项。在本节的最后,我们谈到了如何在我们的应用程序中使用外部文件加载敏感数据。像往常一样,这个应用程序的源代码可以在GitHub上找到。

相关文章