您的位置:

Spring Boot多配置文件详解

Spring Boot多配置文件是指在开发过程中,一个应用程序中存在多个配置文件,每个配置文件针对不同的环境和不同的需求进行配置。本文将从不同的方面详细阐述Spring Boot多配置文件。

一、Spring Boot配置文件

Spring Boot允许用户通过配置文件来配置应用程序。Spring Boot约定了四种文件扩展名(.properties,.yml,.yaml,.json)来创建配置文件。其默认的配置文件名称为application.properties/application.yml,在src/main/resources目录下。这里我们以application.properties为例进行讲解。

# application.properties

# 配置端口号
server.port=8080

# 配置Context Path
server.servlet.context-path=/demo

# 配置数据源
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

在配置文件中我们可以对端口号、Context Path、数据源进行配置。如果需要使用yml文件作为配置文件,我们只需将application.properties文件更改为application.yml,并修改配置内容即可。

# application.yml

server:
  port: 8080
  servlet:
    context-path: /demo

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/test
    username: root
    password: root
    driver-class-name: com.mysql.jdbc.Driver

二、Spring Boot配置SSL

SSL(Secure Sockets Layer)是一种用于网络安全的协议,它通过加密和解密数据传输来保证数据传输的安全性。Spring Boot为我们提供了配置SSL的方式。需要借助keytool工具生成证书。

首先,我们需要在application.properties文件中添加如下配置:

# 配置SSL
server.ssl.key-store=classpath:ssl/demo.keystore
server.ssl.key-store-type=jks
server.ssl.key-store-password=123456
server.ssl.key-password=123456

其中,server.ssl.key-store指定存储证书的文件位置和名称;server.ssl.key-store-type指定证书的类型;server.ssl.key-store-password指定证书文件的密码;server.ssl.key-password指定证书的密码。

接下来,使用keytool生成证书:

keytool -genkey -alias demo -keyalg RSA -keysize 2048 -keystore demo.keystore

上述命令会在当前目录下生成demo.keystore文件作为证书存储。我们也可以将证书存储在classpath下。

三、Spring Boot多配置文件选择

在实际开发中,我们经常需要为不同的环境(开发、测试、生产)使用不同的配置文件。Spring Boot提供了多种方式来选择不同的配置文件。

第一种方法是根据不同的配置文件名进行选择。以application-dev.properties/application-test.properties/application-prod.properties为例:

# application-dev.properties

# 配置端口号
server.port=8080
# application-test.properties

# 配置端口号
server.port=8081
# application-prod.properties

# 配置端口号
server.port=8082

上述配置文件中指定了不同的端口号。我们只需在启动时指定配置文件名即可。

java -jar demo.jar --spring.profiles.active=dev
java -jar demo.jar --spring.profiles.active=test
java -jar demo.jar --spring.profiles.active=prod

第二种方法是在配置文件中使用条件语句进行选择。以application.yml为例:

# application.yml

server:
  port: 8080

spring:
  profiles:
    active:
      dev:
        server:
          port: 8081
      test:
        server:
          port: 8082
      prod:
        server:
          port: 8083

上述配置文件中使用了Spring框架的条件注解,判断当前环境是否为dev/test/prod环境,然后对端口号进行不同的配置。

四、Spring Boot的配置文件

Spring Boot默认支持多种类型的配置文件,包括properties、yml、yaml、json。对于不同的文件类型,我们需要使用不同的解析器来解析文件内容。如果需要添加自定义的配置文件类型,我们可以添加对应的解析器。

以.properties文件为例,在Spring Boot内置的DefaultPropertiesParser中,我们可以看到如下代码:

private static final Pattern KEY_VALUE_PATTERN = Pattern.compile("^(\\S+)?\\s*[:=] ?(\\S.*)$");

该代码块用于解析.properties文件中的键值对。我们可以看到,该正则表达式的匹配规则为“键值对之间使用空格或=符号进行分隔”。如果我们需要添加自定义的.properties文件类型,例如需要使用xml格式的配置文件,我们可以添加一个专门解析xml格式的解析器。

五、Spring Boot多配置文件打包

在打包时,我们需要将特定环境的配置文件打包进去。Spring Boot提供了两种方式进行配置文件的选择。

第一种方式是在pom.xml中添加显式配置。以application-dev.properties为例:


<build>
  <resources>
    <resource>
      <directory>src/main/resources</directory>
      <includes>
        <include>application-dev.properties</include>
      </includes>
      <filtering>true</filtering>
    </resource>
  </resources>
</build>

上述代码为打包时指定了application-dev.properties文件。我们也可以指定多个文件进行打包。

第二种方式是使用maven插件进行打包。以application-dev.properties为例:

mvn clean package -Dspring.profiles.active=dev

上述命令会将dev环境下的配置文件打包进去,同时也可以指定其他环境。

六、Spring Boot配置文件优先级

Spring Boot在加载配置文件时,会先加载默认的配置文件(application.properties/application.yml),然后根据激活的环境加载对应的配置文件。在多个配置文件中出现相同的配置时,优先级顺序如下:

  1. 命令行参数高于所有的配置
  2. java:comp/env中的JNDI属性
  3. ServletConfig参数
  4. ServletContext参数
  5. 在@ConfigurationProperties注解中声明的属性
  6. 在@Configuration类中声明的@Bean方法
  7. 在@SpringBootApplication类中声明的@Bean方法

七、Spring Boot文件下载

在开发中,我们经常需要下载文件到本地。Spring Boot提供了一个简单的方式进行文件下载。

@RestController
public class FileDownloadController {

    @RequestMapping("/download")
    public ResponseEntity<byte[]> download() throws IOException {

        InputStream inputStream = getClass().getClassLoader().getResourceAsStream("test.pdf");
        byte[] data = IOUtils.toByteArray(inputStream);

        HttpHeaders headers = new HttpHeaders();
        headers.add("Content-Disposition", "attachment; filename=test.pdf");

        return ResponseEntity
                .ok()
                .headers(headers)
                .body(data);
    }
}

上述代码为实现文件下载的Controller类。我们通过调用getClass().getClassLoader().getResourceAsStream("test.pdf")来获取文件输入流,将流数据封装到ResponseEntity对象中,设置Content-Disposition响应头,即可进行文件下载。

八、Spring Boot配置文件加密

Spring Boot提供了一种简单的方式来对配置文件进行加密。我们可以使用jasypt进行加密和解密操作。

第一步是引入jasypt的依赖:

<dependency>
  <groupId>org.jasypt</groupId>
  <artifactId>jasypt-spring-boot-starter</artifactId>
  <version>3.0.3</version>
</dependency>

第二步是在application.properties中进行配置:

# 配置加密和解密密码
jasypt.encryptor.password=secret

# 配置需要加密的属性
myapp.password=ENC(ENCRYPTED_PASSWORD)

在上述代码中,jasypt.encryptor.password指定了加密和解密使用的密码;myapp.password指定了需要加密的属性。我们将需要加密的属性放在ENC()中即可。

使用jasypt加密文件的方式如下:

java -cp jasypt-1.9.2.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input="secret" password=password algorithm=PBEWithMD5AndDES

上述命令用于加密“secret”明文密码,输出加密结果。

九、Spring Boot配置文件密码加密

在实际开发过程中,我们可能会在配置文件中配置数据库密码等重要信息。为了防止这些信息泄露,我们需要对密码进行加密处理。Spring Boot提供了一种简单的方式来对密码进行加密和解密操作。

第一步是在application.properties中进行配置:

# 配置加密和解密密码
jasypt.encryptor.password=secret

第二步是使用jasypt对密码进行加密:

java -cp jasypt-1.9.2.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input="P@ssw0rd" password=secret algorithm=PBEWithMD5AndDES

上述命令用于加密“P@ssw0rd”明文密码,输出加密结果。

第三步是在application.properties中配置加密后的密码:

# 配置数据源
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=ENC(ENCRYPTED_PASSWORD)
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

需要注意的是,我们需要将加密后的密码放在ENC()中,Spring Boot会自动进行解密操作。

总结

本文详细阐述了Spring Boot多配置文件的各个方面,包括配置文件的编写方法、SSL配置、多配置文件选择方法、打包方式、文件下载、配置文件加密等等。希望本文能对您在Spring Boot开发中使用多配置文件有所帮助。