概述
全称,Spring Expression Language。在我们之前的样例中,注入的属性都是静态的基本数据类型或者是已存在的bean
,但有时候我们希望某方法的返回值作为属性注入,像这种动态的属性注入就得使用到SpEL。这是Spring开发的一个语法规则,可以为我们的注入提升很大的灵活性,如:某方法的返回值作为属性、某集合的第i个元素作为属性、指定Map的key所对应的value为属性等等。使用SpEL表达式需要有setters方法。
注入数字时进行简单的计算
public class UserDaoImpl implements UserDao{
private Long l;
public void setL(Long l) {
this.l = l;
}
public String toString() {
return "UserDaoImpl [l=" + l + "]";
}
public void save() { }
}
<bean id="userDao" class="com.spring.firstday.UserDaoImpl">
<!-- 支持:e, +, -, *, /, %, ^ -->
<property name="l" value="#{2e4}"></property>
</bean>
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao ud = (UserDao)ac.getBean("userDao");
System.out.println(ud);
}
/*Console:
* UserDaoImpl [l=20000]
* */
}
注入字符串
<bean id="userDao" class="com.spring.firstday.UserDaoImpl">
<!-- 用单引号引起来字符串 -->
<property name="str" value="#{'abcdef'}"></property>
</bean>
注入比较运算符的结果
<bean id="userDao" class="com.spring.firstday.UserDaoImpl">
<!-- 支持的符号有:<、 > 、 == 、 <= 、 >= -->
<property name="b" value="#{1 <= 10}"></property>
</bean>
注入已存在的bean
<bean id="userDao" class="com.spring.firstday.UserDaoImpl">
<!-- 支持的符号有:<、 > 、 == 、 <= 、 >= -->
<property name="b" value="#{1 <= 10}"></property>
</bean>
<bean id="userService" class="com.spring.firstday.UserServiceImpl">
<property name="ud" value="#{userDao}"></property>
</bean>
注入其他对象的属性
<bean id="userDao" class="com.spring.firstday.UserDaoImpl">
<!-- 支持的符号有:<、 > 、 == 、 <= 、 >= -->
<property name="db" value="#{1 <= 10}"></property>
</bean>
<bean id="userService" class="com.spring.firstday.UserServiceImpl">
<property name="sb" value="#{userDao.db}"></property>
</bean>
注入方法的返回值
<bean id="userDao" class="com.spring.firstday.UserDaoImpl">
<!-- 支持的符号有:<、 > 、 == 、 <= 、 >= -->
<property name="db" value="#{1 <= 10}"></property>
</bean>
<bean id="userService" class="com.spring.firstday.UserServiceImpl">
<property name="sb" value="#{userDao.getDb()}"></property>
</bean>
注入字符串的粘贴
public class UserDaoImpl implements UserDao{
private Boolean db;
public void setDb(Boolean db) {
this.db = db;
}
public Boolean getDb() {
return db;
}
public String getA() { return "a"; }
public String getB() { return "b"; }
public String toString() {
return "UserDaoImpl [db=" + db + "]";
}
public void save() { }
}
<bean id="userDao" class="com.spring.firstday.UserDaoImpl">
<!-- 支持的符号有:<、 > 、 == 、 <= 、 >= -->
<property name="db" value="#{1 <= 10}"></property>
</bean>
<bean id="userService" class="com.spring.firstday.UserServiceImpl">
<property name="str" value="#{userDao.getA() + ' ' + userDao.getB()}"></property>
</bean>
注入String的某个字符
<bean id="userService" class="com.spring.firstday.UserServiceImpl">
<!-- str 可以是String,可以是Character -->
<property name="str" value="#{'abcdef'[2]}"></property>
</bean>
注入方法返回值时的null处理
public class UserDaoImpl implements UserDao{
private Boolean db;
public void setDb(Boolean db) {
this.db = db;
}
public Boolean getDb() {
return db;
}
public String getA() { return null; }
public String getB() { return "b"; }
public String toString() {
return "UserDaoImpl [db=" + db + "]";
}
public void save() { }
}
<bean id="userService" class="com.spring.firstday.UserServiceImpl">
<!-- 如果写 #{userDao.getA()?.toUpperCase()} 会发生异常,因为userDao.getA()返回的是null -->
<property name="str" value="#{userDao.getA()?.toUpperCase()}"></property>
</bean>
注入静态方法返回值
public class UserDaoImpl implements UserDao{
private Boolean db;
public void setDb(Boolean db) {
this.db = db;
}
public Boolean getDb() {
return db;
}
public String getA() { return null; }
public String getB() { return "b"; }
public static String getStatic() { return "c"; }
public String toString() {
return "UserDaoImpl [db=" + db + "]";
}
public void save() { }
}
<bean id="userService" class="com.spring.firstday.UserServiceImpl">
<!-- 注入静态属性也类似 -->
<!-- T(全类名).静态方法/静态属性 -->
<property name="str" value="#{T(com.spring.firstday.UserDaoImpl).getStatic()}"></property>
</bean>
使用逻辑运算符号
<bean id="userService" class="com.spring.firstday.UserServiceImpl">
<!-- 支持 and or not ! -->
<property name="sb" value="#{(!userDao.getDb()) and userDao.getDb()}"></property>
</bean>
使用三元运算符
<bean id="userService" class="com.spring.firstday.UserServiceImpl">
<!--
?:的使用
"#{kenny.song != null ? kenny.song : 'Greensleeves'}"
<==> "#{kenny.song ?: 'Greensleeves'}"
-->
<property name="sb" value="#{userDao.getDb()? false : true}"></property>
</bean>
注入Collection的某个元素(String也适用)
import java.util.ArrayList;
import java.util.List;
public class UserDaoImpl implements UserDao{
private Boolean db;
public void setDb(Boolean db) {
this.db = db;
}
public Boolean getDb() {
return db;
}
public String getA() { return null; }
public String getB() { return "b"; }
public static String getStatic() { return "c"; }
public List<String> getList(){
List<String> l = new ArrayList<>();
l.add("aa"); l.add("bb"); l.add("cc");
return l;
}
public String toString() {
return "UserDaoImpl [db=" + db + "]";
}
public void save() { }
}
<bean id="userService" class="com.spring.firstday.UserServiceImpl">
<property name="str" value="#{userDao.getList()[1]}"></property>
</bean>
获取集合的第一个值
<bean id="userService" class="com.spring.firstday.UserServiceImpl">
<!-- 集合对象.^[条件] -->
<property name="str" value="#{userDao.getList().^[true]}"></property>
</bean>
获取集合的最后一个值
<bean id="userService" class="com.spring.firstday.UserServiceImpl">
<!-- 集合对象.$[条件] -->
<property name="str" value="#{userDao.getList().$[true]}"></property>
</bean>
筛选Collection的某个子集(会产生新的集合)
- 几何中存储自定义类型数据
public class Person {
private String name;
private Integer age;
public Person(String name, Integer age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
public List<Person> getList(){
List<Person> l = new ArrayList<>();
l.add(new Person("a", 12)); l.add(new Person("b", 22)); l.add(new Person("c", 32));
return l;
}
<bean id="userService" class="com.spring.firstday.UserServiceImpl">
<property name="list" value="#{userDao.getList().?[age > 20]}"></property>
</bean>
<bean id="userService" class="com.spring.firstday.UserServiceImpl">
<!-- 集合.?[条件] -->
<property name="list" value="#{userDao.getList().?[age > 20]}"></property>
</bean>
- 集合中存储已存在类型数据
<bean id="userService" class="com.spring.firstday.UserServiceImpl">
<!-- 集合.?[条件] -->
<property name="list" value="#{userDao.getList().?[startsWith('a')]}"></property>
</bean>
注入Map的key对应的Value
Map<String, Integer> map;
public Map<String, Integer> getMap() {
return map;
}
public void setMap(Map<String, Integer> map) {
this.map = map;
}
public class UserServiceImpl implements UserService{
private Integer i;
public void setList(Integer i) {
this.i = i;
}
public String toString() {
return "UserServiceImpl [i=" + i + "]";
}
public void save() { }
}
<bean id="userDao" class="com.spring.firstday.UserDaoImpl">
<property name="db" value="#{1 <= 10}"></property>
<property name="map">
<map>
<entry key="aa" value="1"></entry>
<entry key="bb" value="2"></entry>
<entry key="bb" value="3"></entry>
</map>
</property>
</bean>
<bean id="userService" class="com.spring.firstday.UserServiceImpl">
<!-- 集合.?[条件] -->
<property name="list" value="#{userDao.map['aa']}"></property>
</bean>
注入集合某元素的投影
public List<Person> getList(){
List<Person> l = new ArrayList<>();
l.add(new Person("a", 12)); l.add(new Person("b", 22)); l.add(new Person("c", 32));
return l;
}
import java.util.List;
public class UserServiceImpl implements UserService{
private List<String> lists;
public void setLists(List<String> lists) {
this.lists = lists;
}
public String toString() {
return "UserServiceImpl [lists=" + lists + "]";
}
public void save() { }
}
<bean id="userService" class="com.spring.firstday.UserServiceImpl">
<!-- 集合.![属性名] -->
<property name="lists" value="#{userDao.getList().![name]}"></property>
</bean>
集合某几个元素的投影
<bean id="userService" class="com.spring.firstday.UserServiceImpl">
<!-- 集合.![属性名...] -->
<property name="lists" value="#{userDao.getList().![name + '~' + age]}"></property>
</bean>
注入筛选后集合的投影
<bean id="userService" class="com.spring.firstday.UserServiceImpl">
<property name="lists" value="#{userDao.getList().?[age > 20].![name + '~' + age]}"></property>
</bean>