简介
本文用示例介绍SpringBoot的@Value的用法。
分类
@Value属性注入功能根据注入的内容来源可分为两类:通过配置文件的属性注入和通过非配置文件的属性注入。
通过配置文件的注入根据配置文件的来源又可分为两类:
- 默认的Spring Boot会自动加载的配置文件application.properties中的属性;
- 自定义配置文件中的属性,需要先通过@PropertySource加载。
非配置文件注入的类型又分为:
- 注入普通字符串
- 注入操作系统属性
- 注入表达式结果
- 注入其他Bean属性
- 注入文件资源
- 注入URL资源
@ConfigurationProperties与@Value
项 | @ConfigurationProperties | @Value |
类型 | Map、内部类、对象等。 | 不支持内部类、对象。 |
spEl表达式 | 不支持 | 支持 |
JSR303数据校验 | 支持 | 不支持 |
功能 | 一个列属性批量注入 | 单属性注入 |
基于配置文件注入
常用操作
application.properties
user.name=admin
@Value在Bean中的使用(注解到字段上)
public class ValueController {
("${user.name}")
private String name;
("${user.password}")
private String password;
}
@Value在Bean中的使用(注解到参数上)
public class ValueController {
private String password;
ValueController( ("${user.password}")private String password){
this.password = password
}
}
还可以注入数组和列表形式
application.properties
tools=car,train,airplane
// 注入数组(自动根据","分割)
("${tools}")
private String[] toolArray;
// 注入列表形式(自动根据","分割)
("${tools}")
private List<String> toolList;
可拼接字符串
application.yml
custom:
name: hello
Controller
package com.knife.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
public class HelloController {
("my name is: " + "${custom.name}")
private String name;
("/test")
public String test() {
return name;
}
}
访问:http://localhost:8080/test
结果:
可指定配置文件
my.properties
user.password=pwd123
@Value在Bean中的使用(注解到字段上)
"classpath:my.properties")(
public class ValueController {
("${user.name}")
private String name;
("${user.password}")
private String password;
}
@Value在Bean中的使用(注解到参数上)
"classpath:my.properties")(
public class ValueController {
private String password;
ValueController( ("${user.password}")private String password){
this.password = password
}
}
默认值注入
无论使用#{}或${}进行属性的注入,当无法获取对应值时需要设置默认值,可以采用如下方式来进行设置。
// 如果属性中未配置ip,则使用默认值
("${ip:127.0.0.1}")
private String ip;
// 如果属性中未配置username,则使用默认值(空字符串)
("${username:}")
private String ip;
// 如果系统属性中未获取到port的值,则使用8888。
("#{systemProperties['port']?:'8888'}")
private String port;
其中${}中直接使用“:”对未定义或为空的值进行默认值设置,而#{}则需要使用“?:”对未设置的属性进行默认值设置。
SpEL
SpEL(Spring Expression Language)即Spring表达式语言,可以在运行时查询和操作数据。使用#{…}作为定界符, 所有在大括号中的字符都将被认为是 SpEL。
// 注入普通字符串,相当于直接给属性默认值
("这是我的字符串")
private String wechatSubscription;
// 注入操作系统属性
("#{systemProperties['os.name']}")
private String systemPropertiesName;
// 注入表达式结果
("#{ T(java.lang.Math).random() * 100.0 }")
private double randomNumber;
// 注入其他Bean属性:注入config对象的属性tool
("#{config.tool}")
private String tool;
// 注入列表形式(自动根据"|"分割)
("#{'${words}'.split('\\|')}")
private List<String> numList;
// 注入文件资源
("classpath:config.xml")
private Resource resourceFile;
// 注入URL资源
("http://www.choupangxia.com")
private URL homePage;
其他网址
SpringBoot之Spring@Value属性注入使用详解 - 云+社区 - 腾讯云A Quick Guide to Spring @Value | Baeldung