Python 官方文档:入门教程 => 点击学习
目录一、springEL-基础介绍二、EL表达式-基础使用三、SpringEL-基础使用四、属性自动注入一、SpringEL-基础介绍 什么是SpringEL(SpEL)?
什么是SpringEL(SpEL)?
为什么要使用SpringEL?
如何使用SpringEL?
两者主要区别
如果是在Spring中使用可以使用**@PropertySource("classpath:my.properties")**加载对应配置文件
# 配置文件
com:
codecoord:
el:
num: 1001
name: el
language:
- java
- spring
- Mysql
- linux
# 逗号分隔可以注入列表
language02: java,spring,mysql,linux
使用EL注入简单值
@Value("1432516744")
private Integer no;
注入配置文件属性值
@Value("${com.codecoord.el.num}")
private Integer num;
@Value("${com.codecoord.el.name}")
private String name;
注入默认值
@Value("${com.codecoord.el.skill:java}")
private String skill;
注入列表
// 错误写法:不支持直接注入yml列表格式语法列表
@Value("${com.codecoord.el.language}")
private List<String> listLanguage;
@Value("${com.codecoord.el.language}")
private String[] strLanguage;
@Value("${com.codecoord.el.language02}")
private List<String> listLanguage02;
@Value("${com.codecoord.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 {
@Value("1432516744")
private Integer no;
@Value("${com.codecoord.el.num}")
private Integer num;
@Value("${com.codecoord.el.name}")
private String name;
@Value("${com.codecoord.el.skill:java}")
private String skill;
/// 不支持直接注入列表
@Value("${com.codecoord.el.language02}")
private List<String> listLanguage02;
@Value("${com.codecoord.el.language02}")
private String[] strLanguage02;
}
向controller中注入配置类,然后访问接口测试结果如下
{
"no": 1432516744,
"num": 1001,
"name": "el",
"skill": "java",
"listLanguage02": [
"java",
"spring",
"mysql",
"linux"
],
"strLanguage02": [
"java",
"spring",
"mysql",
"linux"
]
}
1、使用SpEL注入简单值和普通EL注入使用基本一致
2、SpEl注入map
java类中先使用${spEl.mapInject}注入字符串值,#{}会解析字符串的值转为map
@Value("#{${spEl.mapInject}}")
private Map<String, String> mapInject;
3、SpEl注入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支持和不支持操作
注入完整操作如下
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("#{spElConstant}")
private SpElConstant spElConstant;
@Value("#{spElConstant.name}")
private String name;
@Value("#{spElConstant.showProperty()}")
private String method1;
@Value("#{spElConstant.showProperty('Hell SpringEL')}")
private String method2;
@Value("#{spElConstant.showProperty().toUpperCase()}")
private String method3;
@Value("#{spElConstant.showProperty()?.toUpperCase()}")
private String method4;
@Value("#{T(java.lang.Math).PI}")
private double pi;
@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;
@Value("#{3 * T(java.lang.Math).PI + spElConstant.num}")
private double operation;
@Value("#{spElConstant.num > 100 and spElConstant.num <= 200}")
private boolean logicOperation;
@Value("#{not (spElConstant.num == 100) or spElConstant.num <= 200}")
private boolean logicOperation2;
@Value("#{spElConstant.num > 100 ? spElConstant.num : spElConstant.num + 100}")
private Integer logicOperation3;
@Value("#{spElConstant.product[0]}")
private String str;
@Value("#{spElConstant.product[0]?.toUpperCase()}")
private String upperStr;
@Value("#{spElConstant.productMap['hello']}")
private String mapValue;
@Value("#{spElConstant.productMap[spElConstant.product[0]]}")
private String mapStrByproduct;
@Value("#{spElConstant.cityList.?[population >= 1000]}")
private List<SpElConstant.City> cityList;
@Value("#{spElConstant.cityList.?[population == 900]}")
private SpElConstant.City city;
@Value("#{spElConstant.cityList.?[population >= 1000].![name]}")
private List<String> cityName;
}
注入结果
{
"spElConstant": {
"name": "SpElConstant-name",
"nickname": "tianxin",
"num": 100,
"product": [
"huaweiMate30Pro",
"xiaomi10x5g"
],
"productMap": {
"xiaomi10x5g": "4999",
"huaweiMate30Pro": "5999"
},
"cityList": [
{
"name": "深圳",
"population": 1000
},
{
"name": "杭州",
"population": 2000
},
{
"name": "贵阳",
"population": 900
}
]
},
"name": "SpElConstant-name",
"method1": "showProperty-无参数",
"method2": "showProperty-Hell SpringEL",
"method3": "SHOWPROPERTY-无参数",
"method4": "SHOWPROPERTY-无参数",
"pi": 3.141592653589793,
"random": 0.19997238292235787,
"separator": "\\",
"concatString": "tianxin SpElConstant-name",
"operation": 109.42477796076938,
"logicOperation": false,
"logicOperation2": true,
"logicOperation3": 200,
"str": "huaweiMate30Pro",
"upperStr": "HUAWEIMATE30PRO",
"mapValue": null,
"mapStrByproduct": "5999",
"cityList": [
{
"name": "深圳",
"population": 1000
},
{
"name": "杭州",
"population": 2000
}
],
"city": {
"name": "贵阳",
"population": 900
},
"cityName": [
"深圳",
"杭州"
]
}
Spring操作外部Properties文件
<!-- 首先通过applicaContext.xml中<util:properties>增加properties文件 -->
<!-- 注意需要引入Spring的util schemea命名空间和注意id属性,id属性将在SpringEL中使用 -->
<util:properties id="db" location="classpath:application.properties"/>
public class TestSpringEL {
// 注意db为xml文件中声明的id
@Value("#{db['jdbc.url']}")
private String propertiesValue;
}
SpringEL在使用时仅仅是一个字符串,不易于排错与测试,也没有IDE检查我们的语法,当出现错误时较难检测,复杂的表达式不建议通过SpringEL方式注入。在非必要情况下,不推荐使用SpEl的复杂注入,清晰可读的代码更为重要且有利于排查问题
上述都是通过指定字段进行注入,可以通过@ConfigurationProperties指定前缀进行自动注入
org.springframework.boot.context.properties.ConfigurationProperties
配置类
user:
id: ${random.uuid}
name: autowire
address: unknown
website: www.codecoord.com
age: ${random.int}
自动属性注入类
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties(prefix = "user")
@Data
public class UserConfig {
private String id;
private String name;
private String address;
private String website;
private Integer age;
}
可以通过@EnableConfigurationProperties(value = UserConfig.class)将UserConfig再次强制注入,问题出现在如果UserConfig为第三方jar包内的配置类,则可能出现属性没有注入情况,所以可以指定注入
到此这篇关于SpringBoot SpringEL表达式的使用的文章就介绍到这了,更多相关SpringEL表达式内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
--结束END--
本文标题: SpringBoot SpringEL表达式的使用
本文链接: https://lsjlt.com/news/131072.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-03-01
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0