前言
在项目开发过程中我们偶尔会遇到需要在配置文件中定义属性和值的情况,下面是一些从配置文件中获取值的方式。
1. 属性定义在springboot默认的配置文件中(application.properties或application.yml)
先在默认配置文件中定义属性
test:
userName: ceshi
pass_word: aabb
nickName: 简称
1.1 @Value方式获取
/** springboot测试类
*
* 注意:
* 1.@Value 是 org.springframework.beans.factory.annotation.Value 包下的
* 2.test.userName 的层级
* 3.使用 ${}
*/
@SpringBootTest
public class Test2 {
@Value("${test.userName}")
private String userName;
@Value("${test.pass_word}")
private String password;
@Value("${test.nickName}")
private String nickName;
@Test
void test2 () {
System.out.println("======userName=======" + userName);
System.out.println("======password=======" + password);
System.out.println("======nickName=======" + nickName);
}
}
/* 控制台打印
2024-08-14 16:59:35.070 INFO 5928 --- [ main] com.jpa.Test2 : Started Test2 in 7.476 seconds (JVM running for 8.944)
======userName=======ceshi
======password=======aabb
======nickName=======简称
*/
1.1 @ConfigurationProperties方式获取
@Data
@Component
@ConfigurationProperties(prefix = "test") // 属性所在的层级,不包含具体属性字段
public class ApplicationProperties {
private String userName;
//springboot 会自动给字段的下划线转驼峰
private String passWord;
private String nickName;
}
/**
* springboot测试类
*/
@SpringBootTest
public class Test2 {
@Resource
private ApplicationProperties applicationProperties;
@Test
public void test() {
System.out.println("======applicationProperties=======");
System.out.println(applicationProperties.getUserName());
System.out.println(applicationProperties.getPassWord());
System.out.println(applicationProperties.getNickName());
}
}
/*控制台打印
2024-08-14 17:20:18.220 INFO 7916 --- [ main] com.jpa.Test2 : Started Test2 in 6.523 seconds (JVM running for 7.973)
======applicationProperties=======
ceshi
aabb
简称
*/
由于springboot默认的配置文件使用的编码格式是UTF-8,所以即使在配置文件中使用了中文,控制台也是可以正常展示的,不会出现乱码的情况
2. 属性定义在自定义的配置文件中
自定义配置文件:在resources
文件夹下创建config
文件夹,在config
文件夹下创建email.yml
配置文件.
email:
userName: ceshi1
pass_word: aabb1
nickName: 简称1
2.1 创建自定义配置文件对应的自定义实体类
在实体类中使用@PropertySource
+ @Value
获取属性值
@Data
@Configuration
/**
* @PropertySource 是 org.springframework.context.annotation.PropertySource 包下
* value:是自定义配置文件的相对路径
* @Value 是 org.springframework.beans.factory.annotation.Value 包下
*/
@PropertySource(value = "classpath:config/email.yml")
public class EmailProperties {
@Value("${userName}")
private String userName;
@Value("${pass_word}")
private String passWord;
@Value("${nickName}")
private String nickName;
}
/**
* springboot测试类
*/
@SpringBootTest
public class Test2 {
@Resource
EmailProperties emailProperties;
@Test
void test3 () {
System.out.println("======emailProperties=======");
System.out.println(emailProperties.getUserName());
System.out.println(emailProperties.getPassWord());
System.out.println(emailProperties.getNickName());
}
}
/*控制台打印
2024-08-14 17:40:36.282 INFO 24224 --- [ main] com.jpa.Test2 : Started Test2 in 6.011 seconds (JVM running for 7.445)
======emailProperties=======
haidsun
aabb1
简称1
*/
可以看到上面的打印日志中中文是乱码的。
这是因为SpringBoot在加载自定义配置文件时,默认编码使用的编码方式是:ISO_8859_1,由于项目是使用的UTF-8方式,所以会出现中文乱码的情况。
解决方式:配置@PropertySource
注解的编码属性。encoding = "UTF-8"
@PropertySource(value = "classpath:config/email.yml", encoding = "UTF-8")
public class EmailProperties {
@Value("${userName}")
private String userName;
@Value("${pass_word}")
private String passWord;
@Value("${nickName}")
private String nickName;
}
/*控制台打印
2024-08-14 17:48:06.928 INFO 2644 --- [ main] com.jpa.Test2 : Started Test2 in 7.644 seconds (JVM running for 9.097)
======emailProperties=======
haidsun
aabb1
简称1
*/
2.2 一个自定义配置实体对应多个配置文件
在config
文件夹下再创建配置文件config.yml
使用@PropertySources
注解
@Data
@Configuration
@PropertySources({
@PropertySource(value = "classpath:config/email.yml", encoding = "UTF-8"),
@PropertySource(value = "classpath:config/config.yml", encoding = "UTF-8")
})
@PropertySource(value = "classpath:config/email.yml", encoding = "UTF-8")
public class EmailProperties {
@Value("${userName}")
private String userName;
@Value("${pass_word}")
private String passWord;
@Value("${nickName}")
private String nickName;
@Value("${host}")
private String host;
@Value("${port}")
private String port;
@Value("${auth}")
private String auth;
}
2.3 注意事项
需要注意:
1.我在使用@PropertySource
+ @Value
获取属性值时,在使用@Value
时没有配置属性的层级,而是直接配置属性名。
如果配置属性的层级就会报错!!
所以我们在自定义配置文件时,不要配置属性名相同的属性,即使层级不同也不行,如果属性名相同,那么属性会取最后一个属性值。
2.如果使用@PropertySources
注解,那么在多个配置文件中属性名也不可以相同。
如果相同,那么相同的属性的值会取最后一个配置文件的最后一个同名属性的值。