前言:
使用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所示:

在该类上使用 @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所示:

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、测试程序效果

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)运行结果

二、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所示:

三、@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()等方法,输出结果是错误的,如下图所示:

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

无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、测试程序效果

在配置文件的配置属性时,我踩过的一些坑,均在文章中标注出来了。仅供参考!!!
希望大家在配置绑定时可以完美地避开这些坑!
📢 互动时间
本文的代码和思路是否解决了你的问题?欢迎在评论区分享你的想法或疑问!无论是更好的实现方式,还是遇到的其他问题,都可以详细描述,我会第一时间与你交流探讨。你的点赞/收藏是我持续创作的动力,技术无边界,让我们一起进步!🚀💬