- 字面量和简单表达式
• 字符串拼接
【java】
ExpressionParser parser = new SpelExpressionParser();
String result = (String) parser.parseExpression("'Hello, ’ + ‘World!’").getValue(String.class);
System.out.println(result); // 输出: Hello, World!
• 数值运算
【java】
int result = (Integer) parser.parseExpression(“2 + 3 * 2”).getValue(Integer.class);
System.out.println(result); // 输出: 8
- 属性访问
• 访问对象的属性
【java】
public class Person {
private String name;
private int age;
// Getters and Setters
}
Person person = new Person();
person.setName(“John Doe”);
person.setAge(30);
StandardEvaluationContext context = new StandardEvaluationContext(person);
String name = (String) parser.parseExpression(“name”).getValue(context, String.class);
int age = (Integer) parser.parseExpression(“age”).getValue(context, Integer.class);
System.out.println("Name: " + name); // 输出: Name: John Doe
System.out.println("Age: " + age); // 输出: Age: 30
- 方法调用
• 调用对象的方法
【java】
public class Calculator {
public int add(int a, int b) {
return a + b;
}
}
Calculator calculator = new Calculator();
StandardEvaluationContext context = new StandardEvaluationContext(calculator);
int result = (Integer) parser.parseExpression(“add(10, 20)”).getValue(context, Integer.class);
System.out.println("Result: " + result); // 输出: Result: 30
- 集合操作
• 访问集合中的元素
【java】
List list = Arrays.asList(“apple”, “banana”, “cherry”);
StandardEvaluationContext context = new StandardEvaluationContext();
context.setVariable(“list”, list);
String firstItem = (String) parser.parseExpression("#list[0]").getValue(context, String.class);
boolean containsBanana = (Boolean) parser.parseExpression("#list.contains(‘banana’)").getValue(context, Boolean.class);
System.out.println("First Item: " + firstItem); // 输出: First Item: apple
System.out.println("Contains Banana: " + containsBanana); // 输出: Contains Banana: true
- 条件表达式
• 条件判断
【java】
Person person = new Person();
person.setName(“John Doe”);
person.setAge(30);
StandardEvaluationContext context = new StandardEvaluationContext(person);
boolean isAdult = (Boolean) parser.parseExpression(“age >= 18”).getValue(context, Boolean.class);
String greeting = (String) parser.parseExpression(“age >= 18 ? ‘Hello, adult’ : ‘Hello, child’”).getValue(context, String.class);
System.out.println("Is Adult: " + isAdult); // 输出: Is Adult: true
System.out.println("Greeting: " + greeting); // 输出: Greeting: Hello, adult
- 变量引用
• 引用上下文中的变量
【java】
StandardEvaluationContext context = new StandardEvaluationContext();
context.setVariable(“name”, “Alice”);
context.setVariable(“age”, 25);
String greeting = (String) parser.parseExpression(“name + ’ is ’ + age + ’ years old’”).getValue(context, String.class);
System.out.println("Greeting: " + greeting); // 输出: Greeting: Alice is 25 years old
- 类型转换
• 类型转换
【java】
String numberStr = “123”;
int number = (Integer) parser.parseExpression(“T(Integer).parseInt(#numberStr)”).getValue(new StandardEvaluationContext(), Integer.class);
System.out.println("Number: " + number); // 输出: Number: 123
- 注解中的SpEL表达式
• 在注解中使用SpEL表达式
假设你有一个方法需要根据传入的用户对象生成锁的键,你可以在注解中使用SpEL表达式来实现:
【java】
public class SysUser {
private String username;
// Getter and Setter
}
@Service
public class MyService {
// 假设这里有一个需要加锁的方法
public void someMethod(@LockKey("#user.username") String lockKey) {
// 方法实现
}
}
// 自定义注解
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface LockKey {
String value();
}
在上面的示例中,@LockKey注解中的#user.username就是一个SpEL表达式,它会在运行时被解析为传入someMethod方法的SysUser对象的username属性。
这些示例展示了SpEL在不同场景下的应用,包括字面量表达式、属性访问、方法调用、集合操作、条件表达式、变量引用、类型转换以及在注解中使用SpEL表达式等。通过这些示例,你可以更好地理解SpEL的语法和功能,并在实际开发中灵活运用它。