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);
}
}