Spring SpEL:程序员必备技能大揭秘!
创作时间:
作者:
@小白创作中心
Spring SpEL:程序员必备技能大揭秘!
引用
CSDN
等
8
来源
1.
https://blog.csdn.net/qq_16992475/article/details/136427783
2.
https://blog.csdn.net/m0_56088675/article/details/143816506
3.
https://blog.csdn.net/wlddhj/article/details/136304518
4.
https://blog.csdn.net/qq_26664043/article/details/136116938
5.
https://juejin.cn/post/7352713583225421876
6.
https://developer.aliyun.com/article/928160
7.
https://juejin.cn/post/7387380647268646938
8.
https://www.yicaiai.com/news/article/678bc2944ddd79f11a3f5d97
在Spring框架中,SpEL(Spring Expression Language)是一种强大的表达式语言,它允许开发者在运行时动态计算值、操作对象图以及执行基本运算。SpEL广泛应用于依赖注入、AOP配置及数据绑定等场景,为开发者提供了一种灵活且强大的工具。
01
基础概念
SpEL支持多种表达式类型,包括字面量、方法调用、属性访问、算术运算、逻辑运算、变量引用等。下面是一些常见的使用场景和案例。
字面量和简单表达式
最简单的SpEL表达式就是字面量,例如字符串和数值:
String result = parser.parseExpression("'Hello, ' + 'World!'").getValue(String.class);
// result = "Hello, World!"
int result = parser.parseExpression("2 + 3 * 2").getValue(Integer.class);
// result = 8
属性访问
SpEL可以轻松访问对象的属性:
public class Person {
private String name;
private int age;
// Getters and Setters
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
Person person = new Person();
person.setName("John Doe");
person.setAge(30);
ExpressionParser parser = new SpelExpressionParser();
StandardEvaluationContext context = new StandardEvaluationContext(person);
String name = parser.parseExpression("name").getValue(context, String.class);
int age = parser.parseExpression("age").getValue(context, Integer.class);
// name = "John Doe"
// age = 30
方法调用
SpEL还支持直接调用对象的方法:
public class Calculator {
public int add(int a, int b) {
return a + b;
}
}
Calculator calculator = new Calculator();
ExpressionParser parser = new SpelExpressionParser();
StandardEvaluationContext context = new StandardEvaluationContext(calculator);
int result = parser.parseExpression("add(10, 20)").getValue(context, Integer.class);
// result = 30
集合操作
对于集合操作,SpEL提供了简洁的语法:
List<String> list = Arrays.asList("apple", "banana", "cherry");
ExpressionParser parser = new SpelExpressionParser();
StandardEvaluationContext context = new StandardEvaluationContext();
context.setVariable("list", list);
String firstItem = parser.parseExpression("#list[0]").getValue(context, String.class);
// firstItem = "apple"
boolean containsBanana = parser.parseExpression("#list.contains('banana')").getValue(context, Boolean.class);
// containsBanana = true
条件表达式
SpEL支持条件判断,可以实现复杂的逻辑:
Person person = new Person();
person.setName("John Doe");
person.setAge(30);
ExpressionParser parser = new SpelExpressionParser();
StandardEvaluationContext context = new StandardEvaluationContext(person);
boolean isAdult = parser.parseExpression("age >= 18").getValue(context, Boolean.class);
// isAdult = true
String greeting = parser.parseExpression("age >= 18 ? 'Hello, adult' : 'Hello, child'").getValue(context, String.class);
// greeting = "Hello, adult"
变量引用
SpEL可以引用上下文中的变量,实现更灵活的表达式:
ExpressionParser parser = new SpelExpressionParser();
StandardEvaluationContext context = new StandardEvaluationContext();
context.setVariable("name", "Alice");
context.setVariable("age", 25);
String greeting = parser.parseExpression("name + ' is ' + age + ' years old'").getValue(context, String.class);
// greeting = "Alice is 25 years old"
02
高级应用
除了基本功能外,SpEL还提供了许多高级特性,如集合投影、条件判断和表达式模板。
集合投影
集合投影允许对集合中的元素进行筛选和转换:
List<City> cities = Arrays.asList(
new City("aaa", 500),
new City("bbb", 600),
new City("ccc", 1000),
new City("ddd", 1000),
new City("eee", 2000),
new City("fff", 3000)
);
ExpressionParser parser = new SpelExpressionParser();
StandardEvaluationContext context = new StandardEvaluationContext();
context.setVariable("cities", cities);
List<String> largeCities = parser.parseExpression("#cities.?[population > 1000].name").getValue(context, List.class);
// largeCities = ["eee", "fff"]
表达式模板
表达式模板允许将表达式嵌入到字符串中,简化代码:
String template = "Hello, #{name}!";
ExpressionParser parser = new SpelExpressionParser();
StandardEvaluationContext context = new StandardEvaluationContext();
context.setVariable("name", "Alice");
String greeting = parser.parseExpression(template).getValue(context, String.class);
// greeting = "Hello, Alice!"
03
最佳实践
在实际开发中,SpEL常用于依赖注入、AOP配置和数据绑定等场景。
依赖注入
SpEL可以用于动态注入值:
@Value("#{systemProperties['java.version']}")
private String javaVersion;
AOP配置
在AOP配置中,SpEL可以实现复杂的切点表达式:
@Pointcut("execution(* com.example.service.*.*(..)) && args(name) && @annotation(com.example.annotation.MyAnnotation)")
public void myPointcut(String name) {}
数据绑定
SpEL在数据绑定中也非常有用:
public class MyForm {
@Value("#{request.getParameter('username')}")
private String username;
}
掌握Spring SpEL不仅能提升代码灵活性和可维护性,还能让你在面试中脱颖而出。它为开发者提供了一种强大且灵活的方式来处理动态表达式,简化了代码实现,并提升了开发效率。
热门推荐
探秘贵州:黑叶猴与桃花水母的奇妙世界
榕江“村超”,贵州山水传奇的狂欢盛宴
耳鸣烦恼怎么办?选对科室是治疗第一步
70亿LLaMA媲美5400亿PaLM,MIT惊人研究用“博弈论”改进大模型
荔波小七孔景区购票攻略:手把手教你买票入园!
荔波小七孔:七孔桥畔的浪漫传说与绝美风光
布洛芬什么时候吃?医生专业解答用药时机与注意事项
布洛芬:剂型不同,效果大不同
深入解析MongoDB的存储原理
二月二:解读“龙抬头”在中华文化中的象征意义
二月二,福建这些“龙抬头”习俗你get了吗?
美国心脏协会推荐:如何通过饮食预防心脏病?
白桦:一位浪漫派作家的艺术人生
全男班《骆驼祥子》:创新演绎让经典焕发新生
化橘红的功效与作用:从古至今的全面解读
北京神外所脑干病变治疗获重大突破!
张家界西站至天子山景区距离、交通方式及旅行时间详解
张家界游玩攻略:景点精华、行程规划与实用信息全解析
切割机换片的步骤和技巧是什么?这种操作在设备维护中的应用效果如何?
切割机安全操作规程有哪些要点?
从“青海摇”到直播带货:《弯刀划过红玫瑰》的抖音爆火之路
从“青海摇”到神曲:《弯刀划过红玫瑰》的爆火之路
从被拐到反拐:杨妞花的26年寻亲路
防冻液好坏的判断标准是什么?如何挑选优质防冻液?
11个国家的货币上都有"中国造"
古代文物上的百变哪吒
兴义地质公园博物馆:贵州龙化石里的远古奥秘
探秘贵州古镇:从镇远到西江千户苗寨
暑假必打卡!跟着贵州导游小安拍出绝美照片
长效降压药的正确用法,你get了吗?