8-spring的表达式:SpEL

本文详细介绍了Spring的表达式语言SpEL,包括字面量赋值、引用对象属性和方法、算术和逻辑运算、字符串连接、条件判断以及正则表达式验证等功能,并给出了多个配置示例,展示了SpEL在Spring中动态配置bean的强大能力。
摘要由CSDN通过智能技术生成

Spring 表达式语言(简称SpEL):是一个支持运行时查询和操作对象图的强大的表达式语言。
语法类似于 EL:SpEL 使用 #{…} 作为定界符,所有在大框号中的字符都将被认为是 SpEL。
SpEL 为 bean 的属性进行动态赋值提供了便利。
1.通过 SpEL 可以实现:
2.通过 bean 的 id 对 bean 进行引用
3.调用方法以及引用对象中的属性
4.计算表达式的值
5.正则表达式的匹配

1.字面常量

    <bean id="emp1" class="com.qwy.bean.Emp">
        <!--整型变量-->
        <property name="empno" value="#{1111}"/>
        <!--字符串-->
        <property name="ename" value="#{'admin'}"/>
        <!--科学计数法-->
        <property name="sal" value="#{1E4}"/>
        <!--浮点类型-->
        <property name="comm" value="#{300.19}"/>
        <property name="mgr" value="#{2222}"/>
        <!--boolean-->
        <property name="flag" value="#{true}"/>
    </bean>

2.引用对象,对象的属性,对象的方法

<bean id="dept" class="com.qwy.bean.Dept">
        <property name="deptno" value="10"/>
        <property name="dname" value="市场部"/>
        <property name="loc" value="济南"/>

    </bean>
    <!--引用外部bean-->
    <bean id="emp2" class="com.qwy.bean.Emp">
        <!--引用外部bean: 功能类似于ref属性-->
        <property name="dept" value="#{dept}"/>
        <!--引用外部bean的属性-->
        <property name="deptno" value="#{dept.deptno}"/>
        <!--调用其他bean的方法-->
        <property name="info" value="#{dept.toString()}"/>
    </bean>

3. 算术运算符 + - * / % ^ 等

 <bean id="emp3" class="com.qwy.bean.Emp">
        <property name="comm" value="#{2000 + 3000}"/>
        <property name="sal" value="#{600-100}"/>
        <property name="deptno" value="#{3 * 4}"/>
        <property name="empno" value="#{3 % 4}"/>
        <property name="mgr" value="#{ 3 /5 }"/>
    </bean>

4. 关系运算符 <, >, ==, <=, >=, lt, gt, eq, le, ge

    <bean id="emp5" class="com.qwy.bean.Emp">
        <property name="flag" value="#{5 > 4}"/>
    </bean>

5. 逻辑运算符 and, or, not, !

    <bean id="emp6" class="com.qwy.bean.Emp">
        <property name="flag" value="#{3> 2 and 4>3}"/>
    </bean>

6. 加号还可以用作字符串连接

    <bean id="emp4" class="com.qwy.bean.Emp">
        <property name="ename" value="#{dept.dname + '  Tom'}"/>
    </bean>

7. 三目运算

    <bean id="emp7" class="com.qwy.bean.Emp">
        <property name="info" value="#{3 > 2 ? '3大于2' : '3不大于2'}"/>
    </bean>

8.支持matches校验

    <bean id="emp8" class="com.qwy.bean.Emp">
        <property name="info" value="#{'123456' matches '[0-9]{1,}'}"/>
    </bean>

9.调用静态方法或静态属性

通过 T() 调用一个类的静态方法,它将返回一个 Class Object,然后再调用相应的方法或属性

    <bean id="emp9" class="com.qwy.bean.Emp">
        <property name="comm" value="#{T(Math).max(3,4)}"/>
    </bean>

文章中的类,纯粹为了演示SpEL,没有任何意义。

10. 需要的POJO

Dept.java
package com.qwy.bean;

/**
 * @author qwy
 * @create 2021-04-23 20:15
 **/
public class Dept {
    private  int deptno;
    private String dname;
    private String loc;

    public int getDeptno() {
        return deptno;
    }

    public void setDeptno(int deptno) {
        this.deptno = deptno;
    }

    public String getDname() {
        return dname;
    }

    public void setDname(String dname) {
        this.dname = dname;
    }

    public String getLoc() {
        return loc;
    }

    public void setLoc(String loc) {
        this.loc = loc;
    }

    @Override
    public String toString() {
        return "Dept{" +
                "deptno=" + deptno +
                ", dname='" + dname + '\'' +
                ", loc='" + loc + '\'' +
                '}';
    }
}

Emp.java
package com.qwy.bean;

import java.util.Date;

/**
 * @author qwy
 * @create 2021-04-23 20:05
 **/
public class Emp {
    private int empno;
    private String ename;
    private String job;
    private float sal;
    private float comm;
    private Date hiredate;
    private int mgr;
    private int deptno;
    private boolean flag;
    private Dept dept;
    private String info;

    public int getEmpno() {
        return empno;
    }

    public void setEmpno(int empno) {
        this.empno = empno;
    }

    public String getEname() {
        return ename;
    }

    public void setEname(String ename) {
        this.ename = ename;
    }

    public String getJob() {
        return job;
    }

    public void setJob(String job) {
        this.job = job;
    }

    public float getSal() {
        return sal;
    }

    public void setSal(float sal) {
        this.sal = sal;
    }

    public float getComm() {
        return comm;
    }

    public void setComm(float comm) {
        this.comm = comm;
    }

    public Date getHiredate() {
        return hiredate;
    }

    public void setHiredate(Date hiredate) {
        this.hiredate = hiredate;
    }

    public int getMgr() {
        return mgr;
    }

    public void setMgr(int mgr) {
        this.mgr = mgr;
    }

    public int getDeptno() {
        return deptno;
    }

    public void setDeptno(int deptno) {
        this.deptno = deptno;
    }

    public boolean isFlag() {
        return flag;
    }

    public void setFlag(boolean flag) {
        this.flag = flag;
    }

    public Dept getDept() {
        return dept;
    }

    public void setDept(Dept dept) {
        this.dept = dept;
    }

    public String getInfo() {
        return info;
    }

    public void setInfo(String info) {
        this.info = info;
    }

    @Override
    public String toString() {
        return "Emp{" +
                "empno=" + empno +
                ", ename='" + ename + '\'' +
                ", job='" + job + '\'' +
                ", sal=" + sal +
                ", comm=" + comm +
                ", hiredate=" + hiredate +
                ", mgr=" + mgr +
                ", deptno=" + deptno +
                ", flag=" + flag +
                '}';
    }
}

11.spring的配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!--注入字面常量-->
    <bean id="emp1" class="com.qwy.bean.Emp">
        <!--整型变量-->
        <property name="empno" value="#{1111}"/>
        <!--字符串-->
        <property name="ename" value="#{'admin'}"/>
        <!--科学计数法-->
        <property name="sal" value="#{1E4}"/>
        <!--浮点类型-->
        <property name="comm" value="#{300.19}"/>
        <property name="mgr" value="#{2222}"/>
        <!--boolean-->
        <property name="flag" value="#{true}"/>
    </bean>

    <bean id="dept" class="com.qwy.bean.Dept">
        <property name="deptno" value="10"/>
        <property name="dname" value="市场部"/>
        <property name="loc" value="济南"/>

    </bean>
    <!--引用外部bean-->
    <bean id="emp2" class="com.qwy.bean.Emp">
        <!--引用外部bean: 功能类似于ref属性-->
        <property name="dept" value="#{dept}"/>
        <!--引用外部bean的属性-->
        <property name="deptno" value="#{dept.deptno}"/>
        <!--调用其他bean的方法-->
        <property name="info" value="#{dept.toString()}"/>
    </bean>
    <!--算术运算符-->
    <bean id="emp3" class="com.qwy.bean.Emp">
        <property name="comm" value="#{2000 + 3000}"/>
        <property name="sal" value="#{600-100}"/>
        <property name="deptno" value="#{3 * 4}"/>
        <property name="empno" value="#{3 % 4}"/>
        <property name="mgr" value="#{ 3 /5 }"/>
    </bean>
    <!-- 连接符-->
    <bean id="emp4" class="com.qwy.bean.Emp">
        <property name="ename" value="#{dept.dname + '  Tom'}"/>
    </bean>
    <!--关系运算符-->
    <bean id="emp5" class="com.qwy.bean.Emp">
        <property name="flag" value="#{5 > 4}"/>
    </bean>
    <!--逻辑运算符-->
    <bean id="emp6" class="com.qwy.bean.Emp">
        <property name="flag" value="#{3> 2 and 4>3}"/>
    </bean>
    <!--三目运算-->
    <bean id="emp7" class="com.qwy.bean.Emp">
        <property name="info" value="#{3 > 2 ? '3大于2' : '3不大于2'}"/>
    </bean>
    <!--支持matches校验-->
    <bean id="emp8" class="com.qwy.bean.Emp">
        <property name="info" value="#{'123456' matches '[0-9]{1,}'}"/>
    </bean>
    <bean id="emp9" class="com.qwy.bean.Emp">
        <property name="comm" value="#{T(Math).max(3,4)}"/>
    </bean>
</beans>

12.测试类

package com.qwy.test;

import com.qwy.bean.Dept;
import com.qwy.bean.Emp;
import com.qwy.bean.Users;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @author qwy
 * @create 2021-04-23 16:02
 **/
public class TestSpring {

    @Test
    public void test1(){
        ApplicationContext ac= new ClassPathXmlApplicationContext("applicationContext.xml");
        Emp emp1 = ac.getBean("emp1", Emp.class);
        //emp1 = Emp{empno=1111, ename='admin', job='null', sal=10000.0, comm=300.19, hiredate=null, mgr=2222, deptno=0, flag=true}
        System.out.println("emp1 = " + emp1);

    }
    @Test
    public void test2(){
        ApplicationContext ac= new ClassPathXmlApplicationContext("applicationContext.xml");
        Emp emp2 = ac.getBean("emp2", Emp.class);
        //dept = Dept{deptno=10, dname='市场部', loc='济南'}
        Dept dept = emp2.getDept();
        System.out.println("dept = " + dept);
        //deptno = 10
        int deptno = emp2.getDeptno();
        System.out.println("deptno = " + deptno);
        //info = Dept{deptno=10, dname='市场部', loc='济南'}
        String info = emp2.getInfo();
        System.out.println("info = " + info);

    }
    @Test
    public void test3(){
        ApplicationContext ac= new ClassPathXmlApplicationContext("applicationContext.xml");
        Emp emp3 = ac.getBean("emp3", Emp.class);
        //emp3 = Emp{empno=3, ename='null', job='null', sal=500.0, comm=5000.0, hiredate=null, mgr=0, deptno=12, flag=false}
        System.out.println("emp3 = " + emp3);

    }
    @Test
    public void test4(){
        ApplicationContext ac= new ClassPathXmlApplicationContext("applicationContext.xml");
        Emp emp4 = ac.getBean("emp4", Emp.class);
        //emp4 = Emp{empno=0, ename='市场部  Tom', job='null', sal=0.0, comm=0.0, hiredate=null, mgr=0, deptno=0, flag=false}
        System.out.println("emp4 = " + emp4);

    }
    @Test
    public void test5(){
        ApplicationContext ac= new ClassPathXmlApplicationContext("applicationContext.xml");
        Emp emp5 = ac.getBean("emp5", Emp.class);
        boolean flag = emp5.isFlag();
        //flag = true
        System.out.println("flag = " + flag);

    }
    @Test
    public void test6(){
        ApplicationContext ac= new ClassPathXmlApplicationContext("applicationContext.xml");
        Emp emp6 = ac.getBean("emp6", Emp.class);
        boolean flag = emp6.isFlag();
        //flag = true
        System.out.println("flag = " + flag);

    }
    @Test
    public void test7(){
        ApplicationContext ac= new ClassPathXmlApplicationContext("applicationContext.xml");
        Emp emp7 = ac.getBean("emp7", Emp.class);
        String info = emp7.getInfo();
        //info = 3大于2
        System.out.println("info = " + info);

    }
    @Test
    public void test8(){
        ApplicationContext ac= new ClassPathXmlApplicationContext("applicationContext.xml");
        Emp emp8 = ac.getBean("emp8", Emp.class);
        String info = emp8.getInfo();
        //info = true
        System.out.println("info = " + info);
    }
    @Test
    public void test9(){
        ApplicationContext ac= new ClassPathXmlApplicationContext("applicationContext.xml");
        Emp emp9 = ac.getBean("emp9", Emp.class);
        float comm = emp9.getComm();
        //comm = 4.0
        System.out.println("comm = " + comm);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值