这一部分的内容我自己都不太会, 随便看看, 把基础语法还有进阶中的锚点掌握就好了, 我这里再挖个坑, 回头有时间, 把这一章补全一下
配置属性验证
配置属性验证可以帮助我们确保应用程序启动时配置值的正确性. SpringBoot支持使用JSR-303 (Bean Validation) 注解来验证 @ConfigurationProperties 类(我不道啊)
首先, 添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>然后, 在@ConfigurationProperties类上添加@Validated注解, 并在属性上使用验证注解
import javax.validation.constraints.*;
@Configuration
@ConfigurationProperties(prefix = "app")
@Validated
public class AppConfig {
@NotNull
@Size(min = 1, max = 100)
private String name;
@Min(0)
@Max(65535)
private int port;
@Email
private String adminEmail;
// getters and setters
}如果验证失败,应用程序将无法启动,并显示详细的错误信息。
配置元数据
创建配置元数据可以提供更好的 IDE 支持,如自动完成和文档。创建一个文件 src/main/resources/META-INF/additional-spring-configuration-metadata.json:
{
"properties": [
{
"name": "app.name",
"type": "java.lang.String",
"description": "Application name."
},
{
"name": "app.port",
"type": "java.lang.Integer",
"description": "Server port."
},
{
"name": "app.admin-email",
"type": "java.lang.String",
"description": "Administrator email address."
}
]
}json大家不会忘了吧, 那我再再挖个坑, 回头再看一遍json
配置属性加密
对于敏感信息, 可以使用Jasypt进行加密.(这个我也不知道, 我就知道个MD5, 回头加密看一下) 首先, 添加依赖
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>然后, 在配置文件中使用加密的值
app:
secret: ENC(encrypted_value_here)在启动应用时提供加密密钥
java -jar your-app.jar --jasypt.encryptor.password=your_secret_key动态配置更新
对于动态配置更新,可以使用 Spring Cloud Config。首先,设置一个 Config Server, 然后添加依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>接着在配置类上添加@RefreshScope注解
@Configuration
@ConfigurationProperties(prefix = "app")
@RefreshScope
public class AppConfig {
// ...
}现在, 当配置更改时, 可以调用/actuator/refresh断电来更新配置
配置文件管理最佳搭配
- 使用版本控制系统管理配置文件
- 使用环境变量处理敏感信息
app:
database:
password: ${DB_PASSWORD}- 为不同环境维护不同的配置文件
- application-dev.yml
- application-prod.yml
配置的单元测试
@SpringBootTest
@TestPropertySource(properties = {
"app.name=TestApp",
"app.port=8080",
"app.admin-email=admin@example.com"
})
public class AppConfigTest {
@Autowired
private AppConfig appConfig;
@Test
public void testConfigProperties() {
assertEquals("TestApp", appConfig.getName());
assertEquals(8080, appConfig.getPort());
assertEquals("admin@example.com", appConfig.getAdminEmail());
}
}上一节YAML进阶使用