0%

Java SpEL

使用SpEL表达式绑定字符串集合

employee.properties

1
2
3
employee.names=james,curry,zimug,姚明
employee.type=教练,球员,经理
employee.age={one:'27', two : '35', three : '34', four: '26'}

Employee

1
2
3
4
5
6
7
8
9
10
11
12
@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;

}
1
2
3
4
5
6
7
8
9
10
11
12
@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结合@Value注解读取配置文件属性

  • 假如我们需要获取第一位(数组下标从0开始)雇员的姓名,可以使用如下的SpEL表达式:

    1
    2
    @Value ("#{'${employee.names}'.split(',')[0]}")
    private String firstEmployeeName;

    属性值注入完成之后,firstEmployeeName=‘’james‘’

  • 我们还可以使用@Value注解将键值对、类对象的数据结构转换为java的Map数据类型

    1
    2
    @Value ("#{${employee.age}}")
    private Map<String, Integer> employeeAge;

    属性值注入完成之后,employeeAge={one=27, two=35, three=34, four=26}

  • 假如我们需要根据Map的Key获取Value属性值,可以使用如下的SpEL表达式:
    1
    2
    3
    @Value ("#{${employee.age}.two}")
    // @Value ("#{${employee.age}['two']}") //这样写也可以
    private String employeeAgeTwo;
    属性值注入完成之后,employeeAgeTwo=35
  • b如果我们不确定,Map中的某个key是否存在,可以使用如下的SpEL表达式。如果key存在就获取对应的value,如果不存在就获得默认值31
    1
    2
    @Value ("#{${employee.age}['five'] ?: 31}") 
    private Integer ageWithDefaultValue;
    属性值注入完成之后,ageWithDefaultValue=31

SpEL结合 @Value注解读取系统环境变量

  • 还可以使用SpEL表达式读取系统环境变量,示例如下,获取JAVA_HOME目录:

    1
    2
    @Value ("#{systemProperties['java.home']}") 
    private String javaHome;
  • 同理,可以获取系统用户工作目录

    1
    2
    @Value ("#{systemProperties['user.dir']}") 
    private String userDir;

10. Spring Expression Language (SpEL)