spring的EL表达式使用示例

目录

简介

代码目录

 引入包版本

 SpEl基础语法

结果

 Spring的SpEL(xml与注解)

 结果

代码下载:https://gitee.com/hong99/spring/issues/I1N1DF

最后


简介

Spring表达式语言(简称SpEL)是一个支持查询并在运行时操纵一个对象图的功能强大的表达式语言。SpEL语言的语法类似于统一EL,但提供了更多的功能,最主要的是显式方法调用基本字符串模板函数

代码目录

 引入包版本


<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.3.11.RELEASE</version>
</dependency>
<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-expression</artifactId>
            <version>4.3.11.RELEASE</version>
</dependency>

 SpEl基础语法


/**
 * @Auther: csh
 * @Date: 2020/7/13 15:53
 * @Description:本示例演示了如何使用SpEL表达式将文本字面值解析为相应的数据类型。
 * 数据类型支持负数、小数、科学计数法及八进制、十六进制数等。默认情况下采用Double.parseDouble)方法进行数值转换。
 */
public class PropertyExprSample {
    public static void main(String[] args) {
        //创建对象
        SpElUser user = new SpElUser("hong",29);
        //构建spel解析上下文
        ExpressionParser parser = new SpelExpressionParser();
        EvaluationContext context = new StandardEvaluationContext(user);
        //获取基本属性值
        String username = (String)parser.parseExpression("userName").getValue(context);
        Integer age = (Integer)parser.parseExpression("age").getValue(context);
        System.out.println(username);
        System.out.println(age);

        //数组
        //注:不支持多维数据初始化,会报错!
        int[]arrayl=(int[])parser.parseExpression("new int[]{1,2,3}").getValue(context);
        int[][]array2=(int[][])parser.parseExpression("new int[2][3]").getValue(context);
        System.out.println(arrayl);
        System.out.println(array2);

        //list的解析
        List list=(List) parser. parseExpression("{1,2,3,4}"). getValue(context);
        List listofLists=(List) parser. parseExpression("{{'a','b'},{'x','y'}}"). getValue(context);
        System.out.println(list);
        System.out.println(listofLists);

        //map列表字符串解析
        Map userInfo=(Map)parser.parseExpression("{userName:'hong',credits:100}").getValue(context);
        List userInfo2=(List)parser.parseExpression("{{userName:'hong',credits:100}, {userName:'tom',credits:100}}").getValue(context);
        System.out.println(userInfo);
        System.out.println(userInfo2);

        //从数组,List,Map中较值
//        String interest1= (String)parser.parseExpression("list[0]").getValue(context);
//        String interest2= (String)parser.parseExpression("listofLists[0]").getValue(context);
//        String interest3= (String)parser.parseExpression("interestsMap I'interest1']").getValue(context);
//        System.out.println(interest1);
//        System.out.println(interest2);
//        System.out.println(interest3);

        //方法解析
        String substring=parser.parseExpression("'Spring SpEL'.substring(7)").getValue(String.class);
        Integer index=parser.parseExpression("'Spring SpEL'.indexOf('SpEL')").getValue(Integer.class);
        System.out.println(substring);
        System.out.println(index);
        //调用实例方法
        boolean iscorrect=parser.parseExpression("viladUsername('123456')").getValue(context,Boolean.class);
        System.out.println("iscorrect:"+iscorrect);
        //调用私有方法,将发生错误
//        iscorrect=parser.parseExpression("viladUsername2('hong')").getValue(context,Boolean.class);
//        System.out.println("iscorrect:"+iscorrect);
        //调用静态方法
        iscorrect=parser.parseExpression("viladUsername3('123456')").getValue(context,Boolean.class);
        System.out.println("iscorrect:"+iscorrect);


        //关系操作符
        boolean trueValue=parser. parseExpression("2==2"). getValue(Boolean. class);
        boolean falseValue=parser. parseExpression("2<-5.0"). getValue(Boolean. class);
        System.out.println(trueValue);
        System.out.println(falseValue);
        //字符串关系比较
        trueValue=parser. parseExpression("\"black\"< \"block\""). getValue(Boolean. class);
        System.out.println(trueValue);
        //instanceOf运算符
        falseValue=parser.parseExpression("' xyz' instanceof T(int)"). getValue(Boolean. class);
        System.out.println(falseValue);
        falseValue=parser.parseExpression(" new java.lang.Integer(1) instanceof T(java.lang.Integer)"). getValue(Boolean. class);
        System.out.println(falseValue);
        //正则运算
        trueValue=parser. parseExpression("'15.00' matches '-?\\d+(\\.\\d{2})?$'"). getValue(Boolean. class);
        System.out.println("正则"+trueValue);
        falseValue=parser. parseExpression("'5.0067' matches '\\^-?\\d+(\\.\\d{2})?$'"). getValue(Boolean. class);
        System.out.println("正则"+falseValue);
        //逻辑操作符 and或&& or或|| !
        falseValue=parser.parseExpression("true&&false").getValue(Boolean.class);
        System.out.println("逻辑判断:"+falseValue);
        String expression ="viladUsername('hong') && viladUsername('hong2')";
        Boolean value = parser.parseExpression(expression).getValue(context, Boolean.class);
        System.out.println("逻辑判断:"+value);
        //或判断
        Boolean orVaild = parser.parseExpression("true or false").getValue(Boolean.class);
        System.out.println("或判断:"+orVaild);
        //非判断
        falseValue = parser.parseExpression("!true").getValue(Boolean.class);
        System.out.println("非判断:"+falseValue);
        //算术运算符 % ^
        Integer add = parser.parseExpression("1+1").getValue(Integer.class);
        System.out.println("加法:"+add);
        //String拼接 结果:teststring
        String testString=parser. parseExpression("\"test\"+''+\"string\""). getValue(String. class);
        System.out.println(testString);
        //减法操作,运行结果等于4
        int four=parser.parseExpression("1 - -3").getValue(Integer.class);
        System.out.println("减法运算符:"+four);
        //减法操作,运行结果等于-9000
        double subtraction=parser.parseExpression("1000.00-1e4").getValue(Double.class);
        System.out.println("减法操作:"+subtraction);
        //乘法操作
        int six = parser.parseExpression("-2 * -3").getValue(Integer.class);
        System.out.println("乘法结果:"+six);
        Double twentFour = parser.parseExpression("2.0 * 3e0 * 4").getValue(Double.class);
        System.out.println("double结果:"+twentFour);
        //除法操作
        double one = parser.parseExpression("8.0/ 4e0 /2").getValue(Double.class);
        System.out.println("除法操作"+one);
        //求余操作
        one = parser.parseExpression("8 / 5 % 2").getValue(Integer.class);
        System.out.println("求余操作:"+one);
        //运算符优先计算操作
        int minusTwentOne = parser.parseExpression("1+2-3*8").getValue(Integer.class);
        System.out.println("运算符优先计算操作:"+minusTwentOne);
        //三元表达式
        expression = " 1==1?true:false";
        Boolean credits = parser.parseExpression(expression).getValue(Boolean.class);
        System.out.println("三元表达式:"+credits);
        //赋值
        parser.parseExpression("userName").setValue(context,"xxxxxxxx");
        System.out.println(user.getUserName());
        //通过表达式赋值
        parser.parseExpression("userName='hong22222222222'").getValue(context);
        System.out.println(user.getUserName());
        //类型
        Class StringClass = parser.parseExpression("T(java.lang.String)").getValue(Class.class);
        System.out.println("判断是否是String,结果是:"+(StringClass==java.lang.String.class));
        Class userClass = parser.parseExpression("T(com.hong.spring.common.entity.SpElUser)").getValue(Class.class);
        System.out.println("用户的类结果是:"+(userClass==com.hong.spring.common.entity.SpElUser.class));
        //变量
        context.setVariable("newUserName","hong2222");
            //赋值
        parser.parseExpression("userName=#newUserName").getValue(context);
        System.out.println("赋值后的结果是:"+user.getUserName());
        //this变量值使用 通过 #xx 来获取
        List<Integer> credisList = new ArrayList <Integer>();
        credisList.addAll(Arrays.asList(150,100,30,111,170,33));
        context.setVariable("creadis",credisList);
        List<Integer> conditionResultLit = (List<Integer>)parser.parseExpression("#creadis.?[#this>100]").getValue(context);
        System.out.println("获取大于100的结果"+conditionResultLit);
        List<Boolean> conditionResultBl = (List<Boolean>)parser.parseExpression("#creadis.![#this>100]").getValue(context);
        System.out.println("获取布尔结果:"+conditionResultBl);
        //售合过滤
        Map<String,Integer> createsMap = new HashMap <String, Integer>();
        createsMap.put("hong",95);
        createsMap.put("song",110);
        createsMap.put("wiki",99);
        createsMap.put("clean",73);
        createsMap.put("arry",170);
        createsMap.put("test2",204);
        context.setVariable("creadisMap",createsMap);
        Map<Integer,String> conditionMap = (Map<Integer,String>)parser.parseExpression("#creadisMap.?[value>100]").getValue(context);
        System.out.println("获取大于100的Map结果:"+conditionMap);
    }
}

结果


hong
29
[I@2eafffde
[[I@59690aa4
[1, 2, 3, 4]
[[a, b], [x, y]]
{userName=hong, credits=100}
[{userName=hong, credits=100}, {userName=tom, credits=100}]
SpEL
7
iscorrect:false
iscorrect:true
true
false
true
false
true
正则true
正则false
逻辑判断:false
逻辑判断:false
或判断:true
非判断:false
加法:2
teststring
减法运算符:4
减法操作:-9000.0
乘法结果:6
double结果:24.0
除法操作1.0
求余操作:1.0
运算符优先计算操作:-21
三元表达式:true
xxxxxxxx
hong22222222222
判断是否是String,结果是:true
用户的类结果是:true
赋值后的结果是:hong2222
获取大于100的结果[150, 111, 170]
获取布尔结果:[true, false, false, true, true, false]
获取大于100的Map结果:{song=110, test2=204, arry=170}

 Spring的SpEL(xml与注解)


<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
       xmlns:util="http://www.springframework.org/schema/util"
       xmlns:cotext="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
    <bean id="numberTest" class="com.hong.spring.common.entity.SpElUser" p:age="#{T(java.lang.Math).random()*100.0}" />
    <!--&lt;!&ndash;使用util&ndash;&gt;-->
    <util:properties id="uifo" location="classpath:spel/user.propertis" />
    <context:component-scan base-package="com.hong.spring.common.entity" />
    <cotext:property-placeholder properties-ref="uifo" />
</beans>

@Component("spElUser2")
public class SpElUser2 implements Serializable {
    @Value("${user.name}")
    private String userName;
    @Value("${user.age}")
    private int age;

    public SpElUser2() {
    }

    public SpElUser2(String userName, int age) {
        this.userName = userName;
        this.age = age;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Boolean viladUsername(String userName){
        return this.userName.equalsIgnoreCase(userName);
    }

    private Boolean viladUsername2(String userName){
        return this.userName.equalsIgnoreCase(userName);
    }

    public static Boolean viladUsername3(String userName){
        return userName.equalsIgnoreCase(userName);
    }
}

 


/**
 * @Auther: csh
 * @Date: 2020/7/13 18:30
 * @Description:实现xml与注解
 */
public class SpringSpEl {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:/spel/applicationfile-spel.xml");
        SpElUser bean = applicationContext.getBean(SpElUser.class);
        System.out.println(bean.getAge());
        SpElUser2 spelUser2 = applicationContext.getBean("spElUser2",SpElUser2.class);
        System.out.println(JSON.toJSONString(spelUser2));

    }
}

 结果


90
{"age":29,"userName":"admin"}

代码下载https://gitee.com/hong99/spring/issues/I1N1DF

最后

    SpEl语句非常强大,但是千万要记住不要一下子就绕进去了,因为复杂的语法真的很难看懂,并且后续不好维护!

参考文章:

Spring EL表达式使用详解

 

SpringEL(Spring Expression Language)是一种强大的表达式语言,它支持在运行时查询和操作对象图。在Spring框架中,SpringEL可以用于各种场景,包括数据源切换。在处理动态数据源切换的场景中,SpringEL可以与Spring AOP(面向切面编程)结合使用,动态地根据业务逻辑来选择不同的数据源。 以下是一个简单的示例来介绍如何通过SpringEL表达式来切换数据源: 1. 首先,你需要定义多个数据源,并配置相应的DataSource Bean。 2. 接着,创建一个动态数据源组件,该组件会根据特定的规则来选择数据源。 3. 在该组件中,你可以使用SpringEL表达式来判断当前的业务场景或条件,并返回相应的数据源。 4. 最后,在实际的业务方法中,使用Spring AOP来拦截方法调用,并根据业务需求使用动态数据源组件来选择正确的数据源。 示例代码框架如下: ```java // 定义数据源 @Bean(name = "dataSource1") public DataSource dataSource1() { // 配置数据源1的详细信息 return new HikariDataSource(); } @Bean(name = "dataSource2") public DataSource dataSource2() { // 配置数据源2的详细信息 return new HikariDataSource(); } // 动态数据源组件 public class DynamicDataSource extends AbstractRoutingDataSource { @Override protected Object determineCurrentLookupKey() { // 使用SpringEL表达式计算并返回当前线程应该使用的数据源标识 return expressionResolver.evaluate("someSpringELExpression", DataSource.class); } } // 配置AOP @Aspect public class DataSourceAspect { @Before("execution(* com.yourpackage.service.*.*(..))") public void setDataSource(JoinPoint point) { // 根据业务逻辑切换数据源 DataSourceContextHolder.setDataSource("dataSource1"); } } ``` 在这个过程中,你需要在AOP的切面中使用一个合适的方法来切换数据源,而这个方法可以通过SpringEL表达式来决定使用哪个数据源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值