初识SpringBoot之配置文件(二)——配置文件值注入

本文介绍Spring Boot中使用@ConfigurationProperties和@Value进行配置文件值注入的方法,对比两者的功能差异,并展示如何解决properties文件的编码问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

 

1、注入配置文件值-@ConfigurationProperties

2、properties配置文件的编码问题

3、注入配置文件值-@Value方法

4、@Value获取值和@ConfigurationProperties获取值比较


1、注入配置文件值-@ConfigurationProperties

yml配置文件:

person:
  lastName: lurenyin
  age: 20
  student: true
  birth: 1999/06/28
  maps: {k1: v1,k2: v2}
  lists:
    - lurenyan
    - springboot
  Dog:
    name: 狗子
    age: 3

javaBean:

/**
 * @ConfigurationProperties告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定;
 * prefix = "person" 用来指明配置文件中哪个下面的所有属性进行一一映射;
 * 只有这个组件是容器中的组件,才能使用容器提供的@ConfigurationProperties功能;
 */
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
    private String lastName;
    private Integer age;
    private Boolean student;
    private Date birth;

    private Map<String,Object> maps;
    private List<Object> lists;
    private Dog dog;
    // 省略getter和setter方法以及toString
}

在此之前可以先导入配置文件处理器,这样我们以后在编写配置文件时就有提示啦!

<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-configuration-processor</artifactId>
      <optional>true</optional>
</dependency>

2、properties配置文件的编码问题

接下来我们看一下properties配置文件的编写:

person.last-name=路人寅
person.age=20
person.student=true
person.birth=1999/06/28
person.maps.k1=v1
person.maps.k2=v2
person.lists=lurenyin,springboot
person.dog.name=狗子
person.dog.age=3

这样我们在启动测试运行的时候就可以看到打印输出结果了:

preview

但是我们会发现我们的中文输出结果是乱码!原因是IDEA使用的是UTF-8编码,而properties文件使用的是ASCII编码,所以在运行时需要转成ASCII编码,我们需要修改以下设置:

preview

这样乱码的问题就解决了:

preview

3、注入配置文件值-@Value方法

yml配置文件同上;

javaBean:

/**
 * Value值可以是字面量/${key}从配置文件中获取的值/#{SpEL}
 * 这里我只注入了三个作为测试
 */
@Component
public class Person {
    @Value("${person.lastName}")
    private String lastName;
    @Value("#{11*2}")
    private Integer age;
    @Value("true")
    private Boolean student;
    private Date birth;

    private Map<String,Object> maps;
    private List<Object> lists;
    private Dog dog;
    //省略getter和setter方法以及toString
}

运行结果如下:

preview

4、@Value获取值和@ConfigurationProperties获取值比较

 @ConfigurationProperties@Value
功能批量注入配置文件中的属性单个注入
松散语法支持不支持
SpEL不支持支持
JSR 303数据校验支持不支持
复杂类型封装支持不支持
  • 那松散语法该怎样理解呢?直白的上个例子:

先上个小知识点:属性名匹配规则:

标准方式:person.lastName
方式一:person.first-name
方式二:person.first_name

以上三种方式都可以使用;

properties配置文件里是这样滴:

preview

@ConfigurationProperties支持松散语法是这样的情况,用@ConfigurationProperties方法注入:

preview

这个运行是不会报错的,这里我就不运行啦~

@Value不支持松散语法是这样滴,用@Value方法注入:

preview

lastName与配置文件里的last-name不一致,这个结果会报错!

  • SpEL(Spring Expression Language),即Spring表达式语言,上个例子叭~

@ConfigurationProperties注入不支持SpEL:下面这种写法就是不可以的!

preview

@Value注入支持SpEL:

preview

  • JSR 303数据校验也举个例子叭~

使用JSR 303数据校验要先加@Validated注解,还要导入下面的依赖:

<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

这里我拿@Email来测试,JSR 303 基本的校验规则可参看JSR303 | 易学教程

测试如下:

preview

由于lurenyin不是邮箱格式,所以会报错,@Email校验起了作用,所以支持JSR 303校验。

preview

@Value方法直接忽略JSR 303校验!所以不支持!

  • 一个最主要的区别是@Value不支持复杂类型封装:

preview

所以具体要使用哪种方式注入配置文件值,大家可以细细斟酌一下喔~

如果感觉有用的话可以给个赞不呀~

(以上截图均来自于我的知乎原创文章,大家若有兴趣,可同时关注我的知乎账号(路人寅)喔)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值