1. 简介
1.1 @value
在spring boot中,@value注解是一个非常有用的特性,它允许我们将外部的配置(如application.properties或application.yml文件中的属性)注入到我们的bean中。这对于读取配置信息,如数据库连接信息、服务地址等,非常有用。
基本用法
@value注解可以应用于字段、setter方法或配置方法上。它使用spel(spring expression language)表达式来读取配置值。
1.2 @configurationproperties
@configurationproperties 是 spring boot 提供的一个非常强大的注解,用于将配置文件中的属性绑定到 java bean 上。与 @value 注解相比,@configurationproperties 提供了更丰富的特性,比如松散绑定(relaxed binding)、jsr-303 数据校验以及复杂的类型绑定等。
基本用法
- 定义一个配置类:首先,你需要定义一个配置类,并使用 @configurationproperties 注解来指定配置的前缀。
- 启用配置属性绑定:默认情况下,spring boot 会自动扫描带有 @configurationproperties 注解的类,并将它们注册为 spring 应用上下文中的 bean。但是,如果你想要精确地控制哪些配置类被注册,你可以在 @enableconfigurationproperties 注解中指定它们。
- 在配置文件中设置属性:在 application.properties 或 application.yml 文件中设置与配置类属性相对应的配置项。
2. 使用
2.1 @value的使用
首先创建springboot的项目
创建application.yml
person:
name : 岳轩子
sex : 雄
age : 18
birthday : 2002/2/31
maps : { k1 : 20 , k2 : 21}
lists : [小黄 , 小黑]
dog:
name : 旺财
创建person.java
import org.springframework.beans.factory.annotation.value;
import org.springframework.stereotype.component;
import org.springframework.validation.annotation.validated;
import java.util.date;
import java.util.list;
import java.util.map;
@component
@validated
public class person {
@value("${person.name}")
private string name;
@value("${person.sex}")
private character sex;
@value("${person.age}")
private integer age;
@value("${person.birthday}")
private date birthday;
private map<string, integer> maps;
private list<string> lists;
private dog dog;
public string getname() {
return name;
}
public void setname(string name) {
this.name = name;
}
public character getsex() {
return sex;
}
public void setsex(character sex) {
this.sex = sex;
}
public integer getage() {
return age;
}
public void setage(integer age) {
this.age = age;
}
public date getbirthday() {
return birthday;
}
public void setbirthday(date birthday) {
this.birthday = birthday;
}
public map<string, integer> getmaps() {
return maps;
}
public void setmaps(map<string, integer> maps) {
this.maps = maps;
}
public list<string> getlists() {
return lists;
}
public void setlists(list<string> lists) {
this.lists = lists;
}
public dog getdog() {
return dog;
}
public void setdog(dog dog) {
this.dog = dog;
}
@override
public string tostring() {
return "person{" +
"name='" + name + '\'' +
", sex=" + sex +
", age=" + age +
", birthday=" + birthday +
", maps=" + maps +
", lists=" + lists +
", dog=" + dog +
'}';
}
}
创建dog类
package com.example.springbootdaily.model;
import org.springframework.beans.factory.annotation.value;
import org.springframework.stereotype.component;
import org.springframework.validation.annotation.validated;
@component
@validated
public class dog {
@value("${person.dog.name}")
private string name;
public string getname() {
return name;
}
public void setname(string name) {
this.name = name;
}
@override
public string tostring() {
return "dog{" +
"name='" + name + '\'' +
'}';
}
}
写一个测试类
import com.example.springbootdaily.model.person;
import org.junit.test;
import org.junit.runner.runwith;
import org.springframework.beans.factory.annotation.autowired;
import org.springframework.boot.test.context.springboottest;
import org.springframework.test.context.junit4.springrunner;
@runwith(springrunner.class)
@springboottest
public class springtest {
@autowired
person person;
@test
public void print(){
system.out.println(person);
}
}
运行结果:
person{name='岳轩子', sex=雄, age=18, birthday=sun mar 03 00:00:00 cst 2002, maps=null, lists=null, dog=null}
2.2 @configurationproperties的用法
创建person2.java
package com.example.springbootdaily.model;
import org.springframework.boot.context.properties.configurationproperties;
import org.springframework.stereotype.component;
import org.springframework.validation.annotation.validated;
import java.util.date;
import java.util.list;
import java.util.map;
@component
@configurationproperties(prefix = "person")
@validated
public class person2 {
private string name;
private character sex;
private integer age;
private date birthday;
private map<string, integer> maps;
private list<string> lists;
private dog dog;
public string getname() {
return name;
}
public void setname(string name) {
this.name = name;
}
public character getsex() {
return sex;
}
public void setsex(character sex) {
this.sex = sex;
}
public integer getage() {
return age;
}
public void setage(integer age) {
this.age = age;
}
public date getbirthday() {
return birthday;
}
public void setbirthday(date birthday) {
this.birthday = birthday;
}
public map<string, integer> getmaps() {
return maps;
}
public void setmaps(map<string, integer> maps) {
this.maps = maps;
}
public list<string> getlists() {
return lists;
}
public void setlists(list<string> lists) {
this.lists = lists;
}
public dog getdog() {
return dog;
}
public void setdog(dog dog) {
this.dog = dog;
}
@override
public string tostring() {
return "person{" +
"name='" + name + '\'' +
", sex=" + sex +
", age=" + age +
", birthday=" + birthday +
", maps=" + maps +
", lists=" + lists +
", dog=" + dog +
'}';
}
}
dog类
package com.example.springbootdaily.model;
import org.springframework.beans.factory.annotation.value;
import org.springframework.stereotype.component;
import org.springframework.validation.annotation.validated;
@component
@validated
public class dog {
private string name;
public string getname() {
return name;
}
public void setname(string name) {
this.name = name;
}
@override
public string tostring() {
return "dog{" +
"name='" + name + '\'' +
'}';
}
}
写测试类
@test
public void print3(){
system.out.println(person2);
}
运行结果:
person{name='岳轩子', sex=雄, age=18, birthday=sun mar 03 00:00:00 cst 2002, maps={k1=20, k2=21}, lists=[小黄, 小黑], dog=dog{name='旺财'}}
3. 区别

3.1 松散绑定
@configurationproperties 的松散绑定(relaxed binding)是 spring boot 提供的一个特性,它允许你在配置文件中使用不同的命名风格(如驼峰命名、短横线分隔等),而 spring boot 能够自动地将其映射到 java bean 的属性上。这种特性使得配置文件的编写更加灵活,同时也使得 java bean 的属性命名更加符合 java 的命名习惯。
松散绑定的工作原理:
当你使用 @configurationproperties 注解来绑定配置文件中的属性时,spring boot 会尝试根据以下规则来匹配属性名:
- 驼峰命名与短横线分隔的互转:如果你的 java bean 属性使用驼峰命名(如 myproperty),那么你可以在配置文件中使用短横线分隔的形式(如 my-property)来设置这个属性的值。spring boot 会自动地将这两种命名风格进行转换。
- 忽略大小写:在松散绑定中,大小写通常会被忽略,但请注意,这取决于你使用的配置文件格式(如 yaml 是大小写敏感的,而 properties 文件则不是)。然而,即使对于大小写敏感的文件格式,spring boot 也会尝试以智能的方式匹配属性名。
- 环境变量:对于环境变量,松散绑定的规则也适用。通常,环境变量名使用大写字母和下划线(如 my_property),而 java bean 属性则使用驼峰命名。spring boot 能够处理这种差异。
例子
application.yml
这里的name中间加了一个线
person:
na-me : 岳轩子
sex : 雄
age : 18
birthday : 2002/2/31
maps : { k1 : 20 , k2 : 21}
lists : [小黄 , 小黑]
dog:
name : 旺财
仍然可以获取
运行结果:
person{name='岳轩子',
3.2 spel
spel(spring expression language)是 spring 框架中的一个功能强大的表达式语言,它支持在运行时查询和操作对象图。spel 是一种类似于 jsp el(javaserver pages expression language)但功能更强大的表达式语言,它用于在运行时查询和操作数据。
主要用途
bean 属性的动态访问:在 spring 配置文件中,你可以使用 spel 来动态地访问和设置 bean 的属性。
注解中的属性值:在 spring 的注解中,你也可以使用 spel 来设置注解的属性值。
xml 配置中的属性值:在 spring 的 xml 配置文件中,可以通过 标签的 value 或 ref 属性结合 spel 来设置属性值。
@value 注解:在 java 代码中,可以使用 @value 注解结合 spel 来注入配置值或计算结果。
特点
功能强大:支持基本运算、关系运算、逻辑运算、正则表达式匹配、集合操作等。
易于使用:语法简洁,易于学习和使用。
集成性好:与 spring 框架紧密结合,可以在 spring 的各种场景中使用。
例子

运行结果
age=20,
3.3 jsp303数据校验
先导入依赖
<dependency>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-starter-validation</artifactid>
</dependency>
这里是@value,不支持
@email
@value("${person.name}")
private string name;
如果不是email的话,会报错

3.4 复杂类型封装
前面已经使用了,@value不能封装map,list和对象类型
但是@configurationproperties可以
以上就是springboot中@value获取值和@configurationproperties获取值用法及比较的详细内容,更多关于@value和@configurationproperties比较的资料请关注代码网其它相关文章!
发表评论