在 Spring 表达式语言 (EL) 中 @ 和 # 有何用途?

简介: 【8月更文挑战第21天】

在 Spring 框架中,Spring 表达式语言(Spring Expression Language,简称 SpEL)是一种强大的表达式语言,它提供了丰富的功能来在应用程序中进行动态值的计算和对象导航。在 SpEL 中,“@”和“#”这两个符号有着特定的用途,为开发者在处理各种业务逻辑和配置时提供了极大的灵活性。

一、“@”的用途

  1. 引用 bean

在 SpEL 中,“@”符号可以用于引用 Spring 容器中的 bean。通过使用“@beanName”的形式,可以在表达式中获取特定 bean 的实例。例如:

@Configuration
public class AppConfig {
   
    @Bean
    public MyService myService() {
   
        return new MyService();
    }
}

public class MyService {
   
    public int calculate() {
   
        return 10;
    }
}

public class SomeClass {
   
    @Autowired
    private ExpressionParser parser;

    public int performCalculation() {
   
        Expression exp = parser.parseExpression("@myService.calculate()");
        return exp.getValue(Integer.class);
    }
}

在这个例子中,“@myService.calculate()”表达式通过“@”符号引用了名为“myService”的 bean,并调用了其“calculate”方法。

  1. 引用环境变量

“@”符号还可以用于引用环境变量。例如,可以使用“@systemProperties['propertyName']”来获取系统属性,或者使用“@environment['variableName']”来获取环境变量的值。

@Configuration
public class AppConfig {
   
    @Value("#{ @environment['myVariable']?: 'defaultValue' }")
    private String myVariableValue;
}

在这个例子中,如果环境变量“myVariable”存在,则将其值赋给“myVariableValue”,否则使用“defaultValue”。

二、“#”的用途

  1. 访问上下文对象

在 SpEL 中,“#”符号用于访问表达式的上下文对象。这个上下文对象通常是一个评估表达式的特定环境,可以是一个 bean 的实例、一个方法的参数或者一个 Spring 容器中的其他对象。

例如,可以使用“#root”来访问根对象,即表达式评估的起始对象。也可以使用“#this”来引用当前正在评估的对象。

public class MyClass {
   
    public int calculateSum(int a, int b) {
   
        ExpressionParser parser = new SpelExpressionParser();
        Expression exp = parser.parseExpression("#this.calculate(a) + #this.calculate(b)");
        return exp.getValue(this, Integer.class, a, b);
    }

    public int calculate(int value) {
   
        return value * 2;
    }
}

在这个例子中,“#this.calculate(a)”和“#this.calculate(b)”表达式使用“#this”来引用当前的“MyClass”实例,并调用其“calculate”方法。

  1. 定义自定义函数

“#”符号还可以用于在 SpEL 中定义自定义函数。通过在表达式中使用“#{... }”的形式,可以定义一个命名的函数,并在表达式中调用它。

@Configuration
public class AppConfig {
   
    @Bean
    public StandardEvaluationContext customEvaluationContext() {
   
        StandardEvaluationContext context = new StandardEvaluationContext();
        context.registerFunction("myFunction", (arg1, arg2) -> arg1 + arg2);
        return context;
    }
}

public class SomeClass {
   
    @Autowired
    private ExpressionParser parser;

    public int performCalculation() {
   
        Expression exp = parser.parseExpression("#{ myFunction(10, 20) }", customEvaluationContext());
        return exp.getValue(Integer.class);
    }
}

在这个例子中,定义了一个名为“myFunction”的自定义函数,它接受两个参数并返回它们的和。在表达式“#{ myFunction(10, 20) }”中,使用“#”符号调用了这个自定义函数。

三、总结

在 Spring 表达式语言中,“@”和“#”符号具有重要的用途。“@”符号主要用于引用 Spring 容器中的 bean 和环境变量,而“#”符号用于访问表达式的上下文对象和定义自定义函数。这些符号使得开发者能够在 Spring 应用程序中进行动态的表达式评估和灵活的配置,提高了应用程序的可维护性和可扩展性。无论是在配置文件中还是在代码中,理解和正确使用“@”和“#”符号可以帮助开发者更好地利用 SpEL 的强大功能,实现更加复杂的业务逻辑和配置需求。

目录
相关文章
|
1月前
|
Java Spring 容器
如何解决spring EL注解@Value获取值为null的问题
本文探讨了在使用Spring框架时,如何避免`@Value("${xxx.xxx}")`注解导致值为null的问题。通过具体示例分析了几种常见错误场景,包括类未交给Spring管理、字段被`static`或`final`修饰以及通过`new`而非依赖注入创建对象等,提出了相应的解决方案,并强调了理解框架原理的重要性。
133 4
|
6月前
|
Java 测试技术 数据库
SpringBoot:@Profile注解和Spring EL
SpringBoot:@Profile注解和Spring EL
|
6月前
|
Java Maven Spring
【Spring】EL表达式失效的问题(添加 isELIgnored)
【Spring】EL表达式失效的问题(添加 isELIgnored)
|
6月前
|
安全 Java 数据安全/隐私保护
【深入浅出Spring原理及实战】「EL表达式开发系列」深入解析SpringEL表达式理论详解与实际应用
【深入浅出Spring原理及实战】「EL表达式开发系列」深入解析SpringEL表达式理论详解与实际应用
489 1
|
5月前
|
前端开发 安全 Java
Spring EL表达式:概念、特性与应用深入解析
Spring EL表达式:概念、特性与应用深入解析
|
6月前
|
传感器 人工智能 前端开发
JAVA语言VUE2+Spring boot+MySQL开发的智慧校园系统源码(电子班牌可人脸识别)Saas 模式
智慧校园电子班牌,坐落于班级的门口,适合于各类型学校的场景应用,班级学校日常内容更新可由班级自行管理,也可由学校统一管理。让我们一起看看,电子班牌有哪些功能呢?
552 4
JAVA语言VUE2+Spring boot+MySQL开发的智慧校园系统源码(电子班牌可人脸识别)Saas 模式
|
4月前
|
安全 Java 数据库
Spring Boot中的Kotlin语言支持
Spring Boot中的Kotlin语言支持
|
6月前
|
Java 开发者 Spring
Spring AOP的切点是通过使用AspectJ的切点表达式语言来定义的。
【5月更文挑战第1天】Spring AOP的切点是通过使用AspectJ的切点表达式语言来定义的。
71 5
|
6月前
|
XML 前端开发 Java
深入理解Spring EL表达式的高级功能
深入理解Spring EL表达式的高级功能
482 1
|
6月前
|
XML 前端开发 Java
掌握Spring EL表达式的基础知识
掌握Spring EL表达式的基础知识
167 1