SpringBootSpringEL表达式的使⽤
⽬录
⼀、SpringEL-基础介绍
⼆、EL表达式-基础使⽤
三、SpringEL-基础使⽤
四、属性⾃动注⼊
⼀、SpringEL-基础介绍
什么是SpringEL(SpEL)?
Spring3中引⼊了Spring表达式语⾔—SpringEL,SpEL是⼀种强⼤,简洁的装配Bean的⽅式
SpringEL可以通过运⾏期间执⾏的表达式将值装配到我们的属性或构造函数当中
为什么要使⽤SpringEL?
平常通过配置⽂件或Annotaton注⼊的Bean,其实都可以称为静态性注⼊
如Bean A中有变量A,它的值需要根据Bean B的B变量为参考,在这场景下静态注⼊就对这样的处理显得⾮常⽆⼒⽽Spring3增加的SpringEL就可以完全满⾜这种需求,⽽且还可以对不同Bean的字段进⾏计算再进⾏赋值,功能⾮常强⼤
如何使⽤SpringEL?
SpringEL从名字来看就能看出和EL是有点关系的,SpringEL的使⽤和EL表达式的使⽤⾮常相似
EL表达式在JSP页⾯更⽅便的获取后台中的值,⽽SpringEL就是为了更⽅便获取Spring容器中的Bean的值
EL使⽤${},⽽SpringEL使⽤#{}进⾏表达式的声明
两者主要区别
$是去外部配置的参数,将值赋过来
#是SpEL表达式,去寻对应变量的内容
也可以直接使⽤@value("常量")注⼊不使⽤EL,这样写法与直接赋值等价
如果是在Spring中使⽤可以使⽤**@PropertySource("classpath:my.properties")**加载对应配置⽂件
⼆、EL表达式-基础使⽤
# 配置⽂件
com:
codecoord:
el:
num: 1001
name: el
language:
- java
- spring
-
mysql
- linux
# 逗号分隔可以注⼊列表
language02: java,spring,mysql,linux
使⽤EL注⼊简单值
/**
* 注⼊简单值,直接注⼊不使⽤EL,EL不⽀持直接指定常量
* 直接在EL中指定的常量会当做配置处理,和直接赋值等价
*/
@Value("1432516744")
private Integer no;
注⼊配置⽂件属性值
/**
* 注⼊整型属性值
*/
@Value("${decoord.el.num}")
private Integer num;
/**
* 注⼊字符属性值
*/
@Value("${decoord.el.name}")
private String name;
注⼊默认值
/**
* 注⼊字符不存在属性值并指定默认值,默认值使⽤过冒号分隔 :
* 注⼊常量其实就可以指定⼀个不存在的配置然后使⽤默认值,此处skill的值为java */
@Value("${decoord.el.skill:java}")
private String skill;
注⼊列表
不⽀持直接配置⽂件中数组语法格式注⼊列表
可以识别使⽤逗号,分隔的配置,spring默认以,分隔
// 错误写法:不⽀持直接注⼊yml列表格式语法列表
@Value("${decoord.el.language}")
private List<String> listLanguage;
@Value("${decoord.el.language}")
private String[] strLanguage;
/**
* ⽀持,分隔的注⼊列表
*/
@Value("${decoord.el.language02}")
private List<String> listLanguage02;
@Value("${decoord.el.language02}")
private String[] strLanguage02;
完整参考如下
配置⽂件
server:
port: 8888
com:
codecoord:
el:
num: 1001
name: el
language:
- java
- spring
-
mysql
- linux
# 逗号分隔可以注⼊列表
language02: java,spring,mysql,linux
属性配置类
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.List;
@Data
@Component
public class ElConfig {
/**
* 注⼊简单值,直接注⼊不使⽤EL,EL不⽀持直接指定常量
* 直接在EL中指定的常量会当做配置处理,和直接赋值等价
*/
@Value("1432516744")
private Integer no;
/**
* 注⼊整型属性值
*/
@Value("${decoord.el.num}")
private Integer num;
/**
* 注⼊字符属性值
*/
@Value("${decoord.el.name}")
private String name;
/**
* 注⼊字符不存在属性值并指定默认值,默认值使⽤过冒号分隔 :
* 注⼊常量其实就可以指定⼀个不存在的配置然后使⽤默认值,此处skill的值为java
*/
@Value("${decoord.el.skill:java}")
private String skill;
/// 不⽀持直接注⼊列表
/*@Value("${decoord.el.language}")
private List<String> listLanguage;
@Value("${decoord.el.language}")
private String[] strLanguage;*/
/**
* ⽀持,分隔的注⼊列表
*/
@Value("${decoord.el.language02}")
private List<String> listLanguage02;
@Value("${decoord.el.language02}")
private String[] strLanguage02;
}
向controller中注⼊配置类,然后访问接⼝测试结果如下
{
"no": 1432516744,
"num": 1001,
"name": "el",
"skill": "java",
"listLanguage02": [
"java",
"spring",
"mysql",
"linux"
],
"strLanguage02": [
"java",
"spring",
"mysql",
"linux"
]
}
三、SpringEL-基础使⽤
1、使⽤SpEL注⼊简单值和普通EL注⼊使⽤基本⼀致
2、SpEl注⼊map
配置⽂件中需要使⽤双引号括起来,否则将会注⼊失败,key为单引号
# SpEl
spEl:
mapInject: "{'name': 'SpEl', 'website': 'deocord'}"
java类中先使⽤${spEl.mapInject}注⼊字符串值,#{}会解析字符串的值转为map @Value("#{${spEl.mapInject}}")
private Map<String, String> mapInject;
3、SpEl注⼊list
除了可以通过EL注⼊listI外,也可以使⽤#{${}.split('分隔符')}的⽅式注⼊List
配置⽂件中例如使⽤#分隔
spEl:
listInject: "44#11#99#100"
java类中先使⽤${spEl.listInject}注⼊字符串值,内容使⽤单引号括起来,然后对字符串使⽤split⽅法分隔提⽰:避免为空情况,可以给⼀个默认值空串
@Value("#{'${spEl.listInject:}'.split('#')}")
private List<String> listInject;
4、动态注⼊
上述注⼊都是静态注⼊,SpEl⽀持从Spring容器中注⼊信息,称为动态注⼊。动态注⼊类如下
import lombok.AllArgsConstructor;
import lombok.Data;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Component
@Data
public class SpElConstant {
private String name = "SpElConstant-name";
private String nickname = "tianxin";
private int num = 100;
private List<String> product = new ArrayList<String>() {{
add("huaweiMate30Pro");
add("xiaomi10x5g");
}};
private Map<String, String> productMap = new HashMap<String, String>() {{
put("huaweiMate30Pro", "5999");
put("xiaomi10x5g", "4999");
}};
private List<City> cityList = new ArrayList<City>() {{
add(new City("深圳", 1000L));
add(new City("杭州", 2000L));
add(new City("贵阳", 900L));
}};
public String showProperty() {
return "showProperty-⽆参数";
}
public String showProperty(String name) {
return "showProperty-" + name;
}
@Data
@AllArgsConstructor
static class City {
private String name;
private long population;
}
}
SpEl⽀持和不⽀持操作
⽀持动态注⼊实例,类似于对象⾃动注⼊
SPL不⽀持直接注⼊配置⽂件中的配置
⽀持调⽤静态和实例⽅法
静态⽅法:@Value("#{T(package.ClassName).ConstFieldName")
⽀持调⽤静态类或常量
⽀持运算符运算
欧美无mate30pro巨⽀持操作集合
⽀持查询筛选集合和投影
注⼊完整操作如下
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map;
@Data
@Component
public class SpElConfig {
/// 不⽀持直接注⼊配置⽂件值
/
*@Value("#{decoord.el.num}")
private Integer num;*/
/**
* 对象注⼊
*/
@Value("#{spElConstant}")
private SpElConstant spElConstant;
/**
* 注⼊ID为spElConstant Bean中的STR常量/变量
*/
@Value("#{spElConstant.name}")
private String name;
/**
* 调⽤⽆参⽅法
*/
@Value("#{spElConstant.showProperty()}")
private String method1;
/**
* 有参接收字符串的⽅法
*/
@Value("#{spElConstant.showProperty('Hell SpringEL')}")
private String method2;
/
**
* ⽅法返回的String为⼤写
*/
@Value("#{spElConstant.showProperty().toUpperCase()}")
private String method3;
/**
* 若使⽤method3这种⽅式,若果showProperty返回为null
* 将会抛出NullPointerException,可以使⽤以下⽅式避免
* 使⽤?.符号代表若然左边的值为null,将不执⾏右边⽅法
*/
@Value("#{spElConstant.showProperty()?.toUpperCase()}")
private String method4;
/**
* 注⼊math常量
*/
@Value("#{T(java.lang.Math).PI}")
private double pi;
/**
* ⽤random⽅法获取返回值
*/
@Value("#{T(java.lang.Math).random()}")
private double random;
/
**
* 获取⽂件路径符号
*/
@Value("#{T(java.io.File).separator}")
private String separator;
/**
* 拼接字符串
*/
@Value("#{spElConstant.nickname + ' ' + spElConstant.name}")
private String concatString;
/**
* 对数字类型进⾏运算,spElConstant拥有num属性
*/
@Value("#{3 * T(java.lang.Math).PI + spElConstant.num}")
private double operation;
/**
* 进⾏逻辑运算
*/
@Value("#{spElConstant.num > 100 and spElConstant.num <= 200}")
发布评论