Spring Boot实现配置绑定的三种方式(IDEA)

前言:

        使用Spring Boot全局配置文件配置属性时,如果配置的属性是Spring Boot内置的属性(如服务端口 server.port),那么 Spring Boot会自动扫描并读取配置文件中的属性值并覆盖原有默认的属性值。如果配置的属性是用户自定义的属性,可以通过Java代码去读取该配置属性,并且把属性绑定到Bean。在Spring Boot项目中可以通过 @Value、Environment对象和@ConfigurationProperties对配置属性进行绑定,下面分别对这三种方式实现配置绑定进行讲解。


一、@Value注释

1、创建实体类

        创建实体类。在 IDEA 中创建一个 Spring Boot 项目,在项目的 java 文件夹下的包——org.ex ample.chapter01下创建一个消费者实体类 Consumer。

项目文件目录如图1-1所示:
图1-1

        在该类上使用 @Component 进行标注 ,并在属性上使用 @Value 注解注入配置文件中的属性,具体内容如下:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.List;
import java.util.Map;

@Component
public class Consumer {
    @Value("${consumer.username}")
    private String username;
    @Value("${consumer.age}")
    private int age;
    @Value("#{'${consumer.hobby}'.split(',')}")
    private String[] hobby;
    @Value("${consumer.subject}")
    private List subject;

    // 重写toString()方法:能够正确地显示对象的属性值,而不是对象的内存地址。
    @Override
    public String toString() {
        return "Consumer{" +
                "username='" + username + '\'' +
                ", age=" + age +
                ", hobby=" + Arrays.toString(hobby) +
                ", subject=" + subject +
                '}';
    }
}
!注:重写toString()方法

        若删去此方法,输出结果可能是对象的内存地址,如图1-2所示:

图1-2

2、添加配置信息

        在项目的 resource 文件夹下创建配置文件 application.yml,在配置文件中添加属性信息,具体内容如下:

consumer:
  username: zhang san
  age: 20
  hobby: read,play
  subject: math,english

3、创建测试类

        在项目 test 文件夹下,在类包 org.example.chapter01下创建测试类 Chapter01Application Tests中注入 Consumer 对象,并新增一个测试方法进行输出测试,具体内容如下:

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class Chapter01ApplicationTests {
    @Autowired
    private Consumer consumer;
    @Test
    void wiredTest() {
        System.out.println(consumer);
    }

}

        在上述代码中,第 7~8 行代码使用 @Autowired 注解将 Spring 容器中的 Consumer 实体类 Bean 注入到 Consumer 对象;第 10~12 行代码的测试方法 wiredTest() 中,将 Consumer 对象输出到控制台。

4、测试程序效果

图1-3

5、第二种方式

        仅变换Consumer.java、Chapter01ApplicationTests.java中的代码,其余内容同上

(1)Consumer.java

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.List;
import java.util.Map;

@Component
public class Consumer {

    @Value("${consumer.username}")
    private String username;

    @Value("${consumer.age}")
    private int age;

    @Value("#{'${consumer.hobby}'.split(',')}")
    private String[] hobby;

    @Value("${consumer.subject}")
    private List<String> subject; // 明确指定List的泛型类型

    // 添加getter和setter方法
    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String[] getHobby() {
        return hobby;
    }

    public void setHobby(String[] hobby) {
        this.hobby = hobby;
    }

    public List<String> getSubject() {
        return subject;
    }

    public void setSubject(List<String> subject) {
        this.subject = subject;
    }
}

(2)Chapter01ApplicationTests.java

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.Arrays;

@SpringBootTest
class Chapter01ApplicationTests {

    @Autowired
    private Consumer consumer;

    @Test
    public void testConsumer() {
        System.out.println("username: " + consumer.getUsername());
        System.out.println("age: " + consumer.getAge());
        System.out.println("hobby: " + Arrays.toString(consumer.getHobby()));             
        System.out.println("subject: " + consumer.getSubject());
    }        //Arrays.toString()方法来转换hobby字段为字符串形式。
}

(3)运行结果

图1-4

二、Environment对象

        使用@Value注解时,将该注解标注在Spring管控的Bean的属性名上方,就可以将数据绑定到Bean对象的属性。当Bean的属性比较多且这些属性都需要绑定配置时,操作起来就比较繁琐。为此,Spring Boot提供了一个对象Environment,项目启动时能够将配置文件中的所有数据都封装到该对象中,这样就不需要手动对配置数据进行绑定。

        使用Environment对象获取配置文件的数据时,不需要再提供其他实体类。

        在文件的Chapter01ApplicationTests类中,通过@Autowired注入Environment对象,并新增测试方法envTest(),在测试方式中通过Environment对象获取配置文件中的属性,具体内容如下:

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.core.env.Environment;

@SpringBootTest
class Chapter01ApplicationTests {
    @Autowired
    private Environment env;
    @Test
    void envTest(){
        System.out.println("consumer.username="+env.getProperty("consumer.username"));
        System.out.println("consumer.age="+env.getProperty("consumer.age"));
        System.out.println("consumer.hobby="+env.getProperty("consumer.hobby"));
        System.out.println("consumer.subject="+env.getProperty("consumer.subject"));
    }

}

        上述代码的envTest()方法中,使用Environment对象的getProperty()方法获取封装到Environm ent对象中的配置文件的数据,该方法的参数为配置数据键的名称。

        运行结果如图1-5所示:

图1-5

三、@ConfigurationProperties注释

        Spring Boot 的@ConfigurationProperties 注解可以将配置文件中的一组配置数据同时绑定到 Bean 中。

1、修改实体类属性的绑定方式

        在文件的 Consumer 类上使用 @ConfigurationProperties 注解进行标注,并且去除属性上方标注的 @Value 注解,具体代码如下:

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.Arrays;
import java.util.List;

@Component
@ConfigurationProperties(prefix = "consumer")
public class Consumer {
    private String username;
    private int age;
    private String[] hobby;
    private List<String> subject;

    //getter和setter方法:允许外部对象访问或修改类的私有成员变量。Spring使用此方法来注入从配置文件中读取的值。
    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String[] getHobby() {
        return hobby;
    }

    public void setHobby(String[] hobby) {
        this.hobby = hobby;
    }

    public List<String> getSubject() {
        return subject;
    }

    public void setSubject(List<String> subject) {
        this.subject = subject;
    }
    //重写的toString()方法返回一个包含类所有属性值的字符串表示形式。
    @Override
    public String toString() {
        return "Consumer{" +
                "username='" + username + '\'' +
                ", age=" + age +
                ", hobby=" + Arrays.toString(hobby) +
                ", subject=" + subject +
                '}';
    }
}

        在上述代码中,@ConfigurationProperties 注解的prefix 属性用于指定绑定配置文件中属性的前缀。Consumer 类中的属性名需要与绑定的配置文件中的属性名保持一致

 !注:getter()、setter()、toString()

        若无getter()、setter()、toString()等方法,输出结果是错误的,如下图所示:

图1-6

getter()、setter()方法,无toString()方法

图1-7​​​​​

无getter()、setter()方法,有toString()方法

故这些方法缺一不可!!!

2、新增测试方法

        在文件的 Chapter01ApplicationTests 中新增测试方法 confTest(),在测试方式中输出 Consumer 对象,具体代码如下:

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class Chapter01ApplicationTests {
    @Autowired
    private Consumer consumer;
    @Test
    void confTest(){
        System.out.println(consumer);
    }

}

3、测试程序效果

图1-8

        在配置文件的配置属性时,我踩过的一些坑,均在文章中标注出来了。仅供参考!!!

        希望大家在配置绑定时可以完美地避开这些坑!


📢 互动时间
        本文的代码和思路是否解决了你的问题?欢迎在评论区分享你的想法或疑问!无论是更好的实现方式,还是遇到的其他问题,都可以详细描述,我会第一时间与你交流探讨。你的点赞/收藏是我持续创作的动力,技术无边界,让我们一起进步!🚀💬

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

元气满满的霄霄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值