SPEL表达式,在很多地方都有体现:
比如:
// spring-cache-redis
@Cacheable(value="user",key="'id:'+#id")
// spring-srcurity
@PreAuthorize("hasAuthority('acl:carType:delete')")
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;
@SpringBootTest
public class SpElTest {
/**
* 解析变量
*/
@Test
public void test() {
User user = new User("zs", 24);
ExpressionParser parser = new SpelExpressionParser();
StandardEvaluationContext context = new StandardEvaluationContext();
context.setVariable("user", user);
System.out.println(parser.parseExpression("#user.age").getValue(context)); // 24
System.out.println(parser.parseExpression("#user").getValue(context)); // User[name=zs, age=24]
}
/**
* 从根对象内解析属性和方法
*/
@Test
public void test1() {
User user = new User("zs", 24);
ExpressionParser parser = new SpelExpressionParser();
StandardEvaluationContext context = new StandardEvaluationContext();
context.setRootObject(user);
System.out.println(parser.parseExpression("name").getValue(context)); // zs
System.out.println(parser.parseExpression("hasPerm('select')").getValue(context)); // true
}
record User(String name, Integer age) {
public boolean hasPerm(String perm) {
if ("select".equals(perm)) {
return true;
} else {
return false;
}
}
}
}
通过 # 来引用上下文内的对象
如果上下文内设置了 根对象 setRootObject,可以直接读取属性和方法
使用单引号来表示普通字符串