一、不通过配置文件的注入属性
1.1 注入普通字符串
直接附在属性名上,在 Bean 初始化时,会赋初始值
@Value("normal")
private String normal;
1.2 注入java系统变量
@Value("#{systemProperties['os.name']}")
private String systemPropertiesName; // 注入操作系统属性
1.3 注入表达式结果
#{ }
里面写表 SpEL 达式
@Value("#{ T(java.lang.Math).random() * 100.0 }")
private double randomNumber; //注入表达式结果
1.4 将配置文件 *.properties 或 *. yml 里 配置的 属性 注入
yml配置如下
book:
name: live
@Value("${book.name}")
private String bookName;
1.5 注入文件资源
@Value("classpath:com/hry/spring/configinject/config.txt")
private Resource resourceFile; // 注入文件资源
1.6 注入url资源
@Value("http://www.baidu.com")
private Resource testUrl; // 注入URL资源
二、通过配置文件的注入属性
Springboot通过@Value注解将配置文件中的属性注入到容器内组件中
(可用在@Controller、@Service、@Configuration、@Component等Spring托管的类中)
2.1 普通字符串注入
例:yml中存在key:
name: zs
@Value注入
@Value("${name}")
public String name;
注:当yml中的name没有对应值时,此时,字符串name的值为""
设置注入属性的默认值(当配置文件中没有此key时,此默认值生效),语法:
// 此时,若配置文件中没有name这个key,变量name的值为zch
@Value("${name:zch}")
public String name;
2.2 常用的int、boolean类型
yml 配置文件
port: 8888
flag: true
Java代码
@Value("${port}")
public int port;
@Value("${flag}")
public boolean flag;
2.3 数组类型
yml 配置文件
id: 1,2,3
Java代码
@Value("${id}")
public int[] idArray;
2.4 list类型
示例1
yml 配置文件
id: 1,2,3
Java代码
@Value("#{'${id}'.split(',')}")
public List<String> idList;
注意:当yml中id没有对应值时,集合idList长度为1,存在值"" (原本以为是空集合,造成bug,特记录)
解决办法
在 split() 之前判断下是否为空即可
@Value("#{'${id:}'.empty ? null : '${id:}'.split(',')}")
private List<String> idList;
示例2
test:
ids:
- 1
- 2
- 3
对于 .properties文件配置如下所以:
test.ids[0]=1
test.ids[1]=2
test.ids[2]=3
如果通过@Value注解获取如下所示:
@Value("${test.ids}")
private List<String> ids;
你会发现程序直接报错了,报错信息如下:
java.lang.IllegalArgumentException: Could not resolve placeholder 'test.ids' in value "${test.ids}"
解决办法
新建一个配置类:
@Data
@Configuration
@ConfigurationProperties("test")
public class GetListConfig {
private List<String> ids;
}
通过注入的方式使用,即可;
2.5 map类型
user: "{name: 'zs',age: '23'}" #注意此值用双引号包裹
Java代码
@Value("#{${user}}")
public Map<String,String> userInfo;
注意: 当yml中user没有对应值时,启动报错