Springboot中读取yml或properties文件的属性
Springboot中读取yml/properties文件的属性
Springboot中读取yml/properties文件的属性
假如我要读取 springboot 项目中的application.properties/application.yml 文件的 某些属性和值
那么我要如何读取?
正文
我在application.properties中,定义几个属性和值
com.lll.db.config=config
com.lll.db.url=url
com.lll.db.data=1230
或者application.yml
com:
lll:
db:
config: config
url: url
data: 1230
@ConfigurationProperties获取(批量获取)
法一:
定义一个MyData类,类中定义config、url、data属性
@ConfigurationProperties(prefix = "com.lll.db")
public class MyData {
private String config;
private String url;
private String data;
// getter / setter
}
定义一个配置类,MyConfiguration
@Configuration
@EnableConfigurationProperties(MyData.class) // 将我们创建的MyData类,启动配置属性
public class MyConfiguration {
@Bean
public MyData myConfig() { // 反转到spring容器里
return new MyData();
}
}
调用测试
@Autowired
private MyData myData;
@GetMapping("/config")
public String getConfig() {
return myData.getUrl()+"--"+myData.getConfig()+"--"+myData.getData();
}
法二:
定义一个MyData类,类中定义config、url、data属性
注意这里不需要@ConfigurationProperties了,只是定义了一个 MyData类
// @ConfigurationProperties(prefix = "com.lll.db")
public class MyData {
private String config;
private String url;
private String data;
// getter/setter
}
配置类
这里不需要 @EnableConfigurationProperties(MyData.class)
@Configuration
// @EnableConfigurationProperties(MyData.class)
public class MyConfiguration {
@Bean
// 直接在需要的地方,使用@ConfigurationProperties(prefix = "")
@ConfigurationProperties(prefix = "com.lll.db")
public MyData myData() {
return new MyData();
}
}
调用测试
@Autowired
private MyData myData;
@GetMapping("/config")
public String getConfig() {
return myData.getUrl()+"--"+myData.getConfig()+"--"+myData.getData();
}
法三:(比较简便)
直接使用 @ConfigurationProperties 和 @Component 即可获取到数据
/**
* 将配置文件中配置的每一个属性的值,映射到这个组件中
*
* @ConfigurationProperties:告诉 SpringBoot 将本类中的所有属性和配置文件中相关的配置进行绑定;
* prefix = "com.lll.db":配置文件中哪个下面的所有属性进行一一映射
*
* 只有这个组件是容器中的组件,才能使用容器提供的@ConfigurationProperties功能;
*/
@ConfigurationProperties(prefix = "com.lll.db")
@Component
public class MyData {
private String config;
private String url;
private String data;
// getter/setter
}
调用测试
@Autowired
private MyData myData;
@GetMapping("/config")
public String getConfig() {
return myData.getUrl()+"--"+myData.getConfig()+"--"+myData.getData();
}
总结
注意:
- 只有在容器中的组件,才会拥有 SpringBoot 提供的强大功能。如果我们想要使用 @ConfigurationProperties 注解进行配置绑定,那么首先就要保证该对 JavaBean 对象在 IoC 容器中,所以需要用到 @Component 注解来添加组件到容器中。
- JavaBean 上使用了注解 @ConfigurationProperties(prefix = “com.lll.db”) ,它表示将这个 JavaBean 中的所有属性与配置文件中以“com.lll.db”为前缀的配置进行绑定。
那么有些时候,我们只需要获取到一个 config属性就好了,其他的都不需要,那么我们可不可以只读取一个属性呢,当然能,使用@Value注解
@Value获取(单个获取)
@Component
public class MyData {
@Value("${com.lll.db.config}")
private String config;
private String url;
private String data;
// getter/setter
}
@Value(“${com.lll.db.config}”)直接指定文件中的某个属性,来给使用了此注解的属性进行赋值
其实可以发现,MyData类是被反转到spring容器里的,然后就可以使用@Value注解
结论:
只要是在spring容器里的组件,我们就可以用@Value注解来获取某些属性的值!!!
例如:
在某实现类中,我们需要用到一个配置文件中的属性值,那么我们在这个实现类被spring管理时就可以直接使用@Value注解来赋值使用
那么两者的区别?
@Value 和 @ConfigurationProperties 注解都能读取配置文件中的属性值并绑定到 JavaBean 中,但两者存在以下不同
到 JavaBean 中,但两者存在以下不同。
1. 使用位置不同
- @ConfigurationProperties:标注在 JavaBean 的类名上;
- @Value:标注在 JavaBean 的属性上。
2. 功能不同
- @ConfigurationProperties:用于批量绑定配置文件中的配置;
- @Value:只能一个一个的指定需要绑定的配置。
3. 松散绑定支持不同
@ConfigurationProperties:支持松散绑定(松散语法),例如实体类 Person 中有一个属性为 lastName,那么配置文件中的属性名支持以下写法:
- person.firstName
- person.first-name
- person.first_name
- PERSON_FIRST_NAME
4.复杂类型封装
- @ConfigurationProperties:支持所有类型数据的封装,例如 Map、List、Set、以及对象等;
- @Value:只支持基本数据类型的封装,例如字符串、布尔值、整数等类型。
5. 应用场景不同
@Value 和 @ConfigurationProperties 两个注解之间,并没有明显的优劣之分,它们只是适合的应用场景不同而已。
- 若只是获取配置文件中的某项值,则推荐使用 @Value 注解;
- 若专门编写了一个 JavaBean 来和配置文件进行映射,则建议使用 @ConfigurationProperties 注解。
我们在选用时,根据实际应用场景选择合适的注解能达到事半功倍的效果。
注意
@ConfigurationProperties和@Value都是支持远程服务器的,比如使用nacos帮我们管理的配置文件,是可以读取到的
更多推荐
所有评论(0)