问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

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不仅能提升代码灵活性和可维护性,还能让你在面试中脱颖而出。它为开发者提供了一种强大且灵活的方式来处理动态表达式,简化了代码实现,并提升了开发效率。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号