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),然后根据激活的环境加载对应的配置文件。在多个配置文件中出现相同的配置时,优先级顺序如下:
- 命令行参数高于所有的配置
- java:comp/env中的JNDI属性
- ServletConfig参数
- ServletContext参数
- 在@ConfigurationProperties注解中声明的属性
- 在@Configuration类中声明的@Bean方法
- 在@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开发中使用多配置文件有所帮助。