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帮我们管理的配置文件,是可以读取到的

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐