前言:之前jsp里面有个叫el表达式的${},今天要说的其实也就跟el表达式类似。
spel表达式
那么什么叫spel表达式呢:它是spring expression language 即spring 表达式语言
要使用spel表达式,首先需要导入spring-spel-xxx.jar这个jar包,顺便放下依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
首先大致一览spel的功能:
- 在表达式中使用字面量
- 引用其他bean
- 引用其他bean的某个属性值
- 调用非静态方法
- 调用静态方法
- 使用运算符
哇,看到这里你会感觉这和el表达式太像了哇,对因为像,所以几下就学会老了
1、在表达式中使用字面量
什么是字面量??字面量就是普通的字符参数,如果整数,小数,布尔,都能直接在#{}之中起作用,而不是引用外 部变量,这些变量可以在表达式中进行运算
<bean id="speltest" class="com.speltest.entity.spelTest">
<property name="uname" value="#{'小白'}"/>
<property name="a" value="#{15*10}"/>
<property name="b" value="#{true }"/>
</bean>
测试类
private ApplicationContext ioc=new ClassPathXmlApplicationContext("applicationContext.xml");
@Test
public void test() {
spelTest speltest= (spelTest) ioc.getBean("speltest");
System.out.println(speltest);
}
结果
spelTest(a=150, b=true, uname=小白)
ok没问题
2、引用其他bean
#{bean的id}就能引用
<bean id="book" class="com.speltest.entity.Book">
<property name="bname" value="java"/>
<property name="btype" value="编程"/>
<property name="bprice" value="58"/>
</bean>
<bean id="speltest02" class="com.speltest.entity.spelTest">
<property name="book" value="#{book}"/>
</bean>
测试类
@Test
public void test03() {
spelTest speltest= (spelTest) ioc.getBean("speltest02");
System.out.println(speltest);
}
结果
spelTest(a=null, b=false, uname=null, book=Book(bname=java, btype=编程, bprice=58.0))
没问题,book已经引用到了
3、引用其他bean的属性值
#{bean的id点出变量}就能引用变量
bean配置
<bean id="book" class="com.speltest.entity.Book">
<property name="bname" value="java"/>
<property name="btype" value="编程"/>
<property name="bprice" value="58"/>
</bean>
<bean id="book2" class="com.speltest.entity.Book">
<property name="btype" value="#{book.btype}"/>
</bean>
测试类
@Test
public void test02() {
Book book= (Book) ioc.getBean("book2");
System.out.println(book);
}
结果
Book(bname=null, btype=编程, bprice=null)
ok没问题,btype已经引用到了,其实编写的时候就会有提示,用bean的id点出变量
4、调用静态方法
这次我们就拿UUID来做测试,这是一个静态类,是java.util下的一个随机id生成工具
语法#{T(全类名).方法名}
bean配置
<bean id="speltest" class="com.speltest.entity.spelTest">
<property name="c" value="#{T(java.util.UUID).randomUUID().toString()}"/>
</bean>
测试类
@Test
public void test() {
spelTest speltest= (spelTest) ioc.getBean("speltest");
System.out.println(speltest);
}
结果
spelTest(a=null, b=false, c=b8b37984-cefd-4bbe-b633-3cfea80210da, uname=null, book=null)
可以看到c的确生成了数字和因为混合的字符串
5、调用非静态方法
语法#{book.getBname()}
bean配置
<bean id="book3" class="com.speltest.entity.Book">
<property name="bname" value="#{book.getBname()}"/>
</bean>
测试类
@Test
public void test04() {
Book book= (Book) ioc.getBean("book3");
System.out.println(book);
}
结果
Book(bname=java, btype=null, bprice=null)
可以看到通过id为book的getBname方法得到了bname的值
6、使用运算符
语法#{直接用java的运算符就行了}
bean配置
<bean id="speltest03" class="com.speltest.entity.spelTest">
<property name="b" value="#{100>50}"/>
</bean>
测试类
@Test
public void test5() {
spelTest speltest = (spelTest) ioc.getBean("speltest03");
System.out.println(speltest);
}
结果
spelTest(a=null, b=true, c=null, uname=null, book=null)
可以看到b的大小判断100>50,是true
pelTest speltest = (spelTest) ioc.getBean(“speltest03”);
System.out.println(speltest);
}
> 结果
`spelTest(a=null, b=true, c=null, uname=null, book=null)`
可以看到b的大小判断100>50,是true