• Spring 中如何使用SpEL表达式语言呢?


    转自:

    Spring 中如何使用SpEL表达式语言呢?

    SpeL简介说明

    SpeL:Spring Expression Language是一种功能强大的表达式语言
    支持运行时查询和操作对象图,
    使用SpeL可采用最少的代码,完成大量的工作

    注意事项:
       SpEL本身同Spring没有关联,它可以独立使用
       SpEL是一个表达式语言
    

    SpEL 提供了以下接口和类
    Expression interface:该接口负责评估表达式字符串
    ExpressionParser interface:该接口负责解析字符串
    EvaluationContext interface:该接口负责定义上下文环境
    SpEL 支持如下表达式:
    1. 基本表达式
    字面量表达式、关系、逻辑与算术运算表达式、字符串连接及截取表达式、三目运算表达式、正则表达式、括号优先级表达式
    2. 类相关表达式
    类类型表达式、类实例化、instanceof 表达式、变量定义及引用、赋值表达式、自定义函数、对象属性存取及安全导航表达式、对象方法调用、Bean 引用
    3. 集合相关表达式
    内联 List、内联数组、集合、字典访问、列表、字典、数组修改、集合投影、集合选择;不支持多维内联数组初始化;不支持内联字典定义
    4. 其他表达式
    模板表达式
    注意事项:SpEL 表达式中的关键字不区分大小写
    例 下面使用 SpEL 输出一个简单的字符串“Hello,我的java265”

    package com.java265;
    import org.springframework.expression.Expression;
    import org.springframework.expression.ExpressionParser;
    import org.springframework.expression.spel.standard.SpelExpressionParser;
    public class Test {
        public static void main(String[] args) {
            // 构造解析器
            ExpressionParser parser = new SpelExpressionParser();
            // 解析器解析字符串表达式
            Expression exp = parser.parseExpression("'Hello,我的java265'");
            // 获取表达式的值
            String message = (String) exp.getValue();
            System.out.println(message);
            // OR
            // System.out.println(parser.parseExpression("'Hello,我的java265'").getValue());
        }
    }
    

    输出结果---
    Hello,我的java265
    SpEL表达式 可调用方法、访问属性和调用构造函数
    例2
    使用 SpEL 调用 concat() 方法

    package com.java265;
    import org.springframework.expression.Expression;
    import org.springframework.expression.ExpressionParser;
    import org.springframework.expression.spel.standard.SpelExpressionParser;
    public class Test {
        public static void main(String[] args) {
            ExpressionParser parser = new SpelExpressionParser();
            Expression exp = parser.parseExpression("'Welcome,我的java265'.concat('!')");
            String message = (String) exp.getValue();
            System.out.println(message);
        }
    }
    

    输出结果----
    Welcome,我的java265!
    例 3
    使用 SpEL 调用 String 的属性 bytes,将字符串转换为字节数组

    package com.java265;
    import org.springframework.expression.Expression;
    import org.springframework.expression.ExpressionParser;
    import org.springframework.expression.spel.standard.SpelExpressionParser;
    public class Test {
        public static void main(String[] args) {
            ExpressionParser parser = new SpelExpressionParser();
            Expression exp = parser.parseExpression("'Hello 我的java265'.bytes");
            byte[] bytes = (byte[]) exp.getValue();
            for (int i = 0; i < bytes.length; i++) {
                System.out.print(bytes[i] + " ");
            }
        }
    }
    
    

    输出结果---
    72 101 108 108 111 32 -79 -32 -77 -52 -80 -17
    例 4
    SpEL 还支持使用嵌套属性,下面将字符串转换为字节后获取长度

    package com.java265;
    import org.springframework.expression.Expression;
    import org.springframework.expression.ExpressionParser;
    import org.springframework.expression.spel.standard.SpelExpressionParser;
    public class Test {
        public static void main(String[] args) {
            ExpressionParser parser = new SpelExpressionParser();
            Expression exp = parser.parseExpression("'Hello 我的java265'.bytes.length");
            int length = (Integer) exp.getValue();
            System.out.println(length);
        }
    }
    

    输出结果
    15


    例 5
    字符串的构造函数可以被调用,而不是使用字符串文本,下面将字符串内容转换为大写字母

    package com.java265;
    import org.springframework.expression.Expression;
    import org.springframework.expression.ExpressionParser;
    import org.springframework.expression.spel.standard.SpelExpressionParser;
    public class Test {
        public static void main(String[] args) {
            ExpressionParser parser = new SpelExpressionParser();
            Expression exp = parser.parseExpression("new String('hello java265').toUpperCase()");
            String message = exp.getValue(String.class);
            System.out.println(message); 
        }
    }
    

    输出结果---
    HELLO JAVA265
    SpEL对Bean定义的支持
    SpEL 表达式可以与 XML 或基于注解的配置元数据一起使用,SpEL 表达式以#{开头,以}结尾,如#{'Hello'}

    基于XML的配置

    可以使用以下表达式来设置属性或构造函数的参数值

     
    

    使用注解的配置

    @Value 注解可以放在字段、方法、以及构造函数参数上,以指定默认值。 以下是一个设置字段变量默认值

    public static class FieldValueTestBean
        @value("#{ systemProperties[ 'user.region'] }")
        private String defaultLocale;
        public void setDefaultLocale (String defaultLocale) {
            this.defaultLocale = defaultLocale;
        }
        public string getDefaultLocale() {
            return this.defaultLocale;
        }
    }
    

    SpEL中的运算符
    我们可以在 SpEL 中使用运算符,例如算术运算符、关系运算符、逻辑运算符
    例 6

    package com.java265;
    import org.springframework.expression.ExpressionParser;
    import org.springframework.expression.spel.standard.SpelExpressionParser;
    public class Test {
        public static void main(String[] args) {
            ExpressionParser parser = new SpelExpressionParser();
            // 算术运算符
            System.out.println(parser.parseExpression("'Hello SPEL'+'!'").getValue());
            System.out.println(parser.parseExpression("8 * 8/4").getValue());
            System.out.println(parser.parseExpression("'今天是:'+ new java.util.Date()").getValue());
            // 逻辑运算符
            System.out.println(parser.parseExpression("true and true").getValue());
            // 关系运算符
            System.out.println(parser.parseExpression("'sonoo'.length()==5").getValue());
        }
    }
    
    

    输出结果---
    Hello SPEL! 14 今天是:Fri Feb 08 09:09:30 CST 2021
    true true SpEL中的变量 在 SpEL 中,我们可以定义变量,并在方法中使用。定义变量需要用到 StandardEvaluationContext 类。 例 7 Calculation 类代码

    package com.java265;
    public class Calculation {
        private int number;
        public int getNumber() {
            return number;
        }
        public void setNumber(int number) {
            this.number = number;
        }
        public int cube() {
            return number * number * number;
        }
    }
    
    

    Test 类

    package com.java265;
    import org.springframework.expression.ExpressionParser;
    import org.springframework.expression.spel.standard.SpelExpressionParser;
    import org.springframework.expression.spel.support.StandardEvaluationContext;
    public class Test {
        public static void main(String[] args) {
            Calculation calculation = new Calculation();
            StandardEvaluationContext context = new StandardEvaluationContext(calculation);
            ExpressionParser parser = new SpelExpressionParser();
            parser.parseExpression("number").setValue(context, "5");
            System.out.println(calculation.cube());
        }
    }
    

  • 相关阅读:
    6-2 顺序表操作集分数 20
    设计模式之观察者模式ObserverPattern(十一)
    2020-2023中国高等级自动驾驶产业发展趋势研究-概念界定
    DockerFile构建过程解析
    【Java】移除元素
    【Kafka专题】Kafka收发消息核心参数详解
    Android 使用addr2line分析so异常
    密码输入检测(100%用例)D卷(Java&&Python&&C++&&Node.js&&C语言)
    顺爷传 13
    浅谈用匈牙利算法寻找二分图的最大匹配
  • 原文地址:https://blog.csdn.net/qq_25073223/article/details/127662710