文章目录
Spring Expression Language (SpEL)是一种功能非常强大的表达式语言,可用于在运行时查询和操作对象。 SpEL书写在XML配置文件或者Annotation注解上,在Spring Bean的创建过程中生效。
SpEL能用在很多的场景下,在这篇文章中,给大家介绍一下在Spring Boot中如何使用SpEL表达式读取配置属性。
一、使用SpEL表达式绑定字符串集合
创建一个配置文件employee.properties,内容如下:
employee.names=james,curry,zimug,姚明
employee.type=教练,球员,经理
employee.age={one:'27', two : '35', three : '34', four: '26'}
- 上文中names和type属性分别代表雇员employee的名字和分类,是字符串类型属性
- age属性代表雇员的年龄,是一组键值对、类对象数据结构
创建一个配置类 Employee
,代码如下:
@Data
@Configuration
@PropertySource (name = "employeeProperties",
value = "classpath:employee.properties",
encoding = "utf-8")
public class Employee {
//使用SpEL读取employee.properties配置文件
@Value("#{'${employee.names}'.split(',')}")
private List<String> employeeNames;
}
- @Value注解和@PropertySource注解参考《YAML配置绑定变量的两种方式》和《加载旧项目配置文件的两种方式》学习
二、测试用例
使用如下测试用例,将属性值绑定到Employee类对象上,并将其打印
@ExtendWith(SpringExtension.class)
//@RunWith(SpringRunner.class) //Junit4开发者使用这个注解
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
public class ValueBindTests {
@Resource
Employee employee;
@Test
public void valueBindTests2() throws Exception {
System.out.println(employee.toString());
}
}
输出结果如图所示,说明使用SpEL读取employee.properties配置文件,并绑定属性值到Employee 对象生效。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Rbtbbqps-1644629364113)(images/screenshot_1591965821753.png)]
上面的例子中,我们使用SpEL表达式读取了employee.names属性,并将其从字符串属性,以逗号为分隔符转换为List类型。属性值注入完成之后,employeeNames=[james, curry, zimug, 姚明]
二、SpEL结合@Value注解读取配置文件属性–更多示例
- 假如我们需要获取第一位(数组下标从0开始)雇员的姓名,可以使用如下的SpEL表达式:
@Value ("#{'${employee.names}'.split(',')[0]}")
private String firstEmployeeName;
属性值注入完成之后,firstEmployeeName=‘’james‘’
- 我们还可以使用@Value注解将键值对、类对象的数据结构转换为java的Map数据类型
@Value ("#{${employee.age}}")
private Map<String, Integer> employeeAge;
属性值注入完成之后,employeeAge={one=27, two=35, three=34, four=26}
- 假如我们需要根据Map的Key获取Value属性值,可以使用如下的SpEL表达式:
@Value ("#{${employee.age}.two}")
// @Value ("#{${employee.age}['two']}") //这样写也可以
private String employeeAgeTwo;
属性值注入完成之后,employeeAgeTwo=35
- 如果我们不确定,Map中的某个key是否存在,可以使用如下的SpEL表达式。如果key存在就获取对应的value,如果不存在就获得默认值31
@Value ("#{${employee.age}['five'] ?: 31}")
private Integer ageWithDefaultValue;
属性值注入完成之后,ageWithDefaultValue=31
三、SpEL结合 @Value注解读取系统环境变量
还可以使用SpEL表达式读取系统环境变量,示例如下,获取JAVA_HOME目录:
@Value ("#{systemProperties['java.home']}")
private String javaHome;
同理,可以获取系统用户工作目录
@Value ("#{systemProperties['user.dir']}")
private String userDir;
当然,除了以上在Spring Boot中使用SpEL的常用用法,SpEL还可以完成算术运算、逻辑运算、正则匹配运算、条件运算等功能。建议大家参照官方文档学习。更多内容可以参考:https://docs.spring.io/spring/docs/4.3.10.RELEASE/spring-framework-reference/html/expressions.html
四、读取properties文件中文乱码问题的解决
File->settings->File Encoding->图所示选项及勾选
使用PropertySource注解时指定encoding