0
点赞
收藏
分享

微信扫一扫

[springboot一本通]-3.6.使用SpEL表达式绑定配置项

芭芭蘑菇 2022-02-20 阅读 139

文章目录

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
在这里插入图片描述

举报

相关推荐

0 条评论