多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
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 对象生效。 ![](https://img.kancloud.cn/c8/00/c800ca6c03bab0de0bf8354175eb1bcf_893x91.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](https://docs.spring.io/spring/docs/4.3.10.RELEASE/spring-framework-reference/html/expressions.html) ## 四、读取properties文件中文乱码问题的解决 File->settings->File Encoding->图所示选项及勾选 ![](https://img.kancloud.cn/da/9e/da9e0b9591666a9a9d5ac98f21592b30_1420x860.png) 使用PropertySource注解时指定encoding ![](https://img.kancloud.cn/e6/fa/e6fabe0c041e589a62c3054fc425f52c_783x126.png)