Spring - XML方式SpEL方法注入(07)

概述

全称,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">
    <!-- 支持的符号有:&lt;、    >  、  == 、  &lt;=  、  >=    -->
    <property name="b" value="#{1 &lt;= 10}"></property>
</bean>

注入已存在的bean

    <bean id="userDao" class="com.spring.firstday.UserDaoImpl">
         <!-- 支持的符号有:&lt;、    >  、  == 、  &lt;=  、  >=    -->
        <property name="b" value="#{1 &lt;= 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">
    <!-- 支持的符号有:&lt;、    >  、  == 、  &lt;=  、  >=    -->
    <property name="db" value="#{1 &lt;= 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">
    <!-- 支持的符号有:&lt;、    >  、  == 、  &lt;=  、  >=    -->
    <property name="db" value="#{1 &lt;= 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">
    <!-- 支持的符号有:&lt;、    >  、  == 、  &lt;=  、  >=    -->
    <property name="db" value="#{1 &lt;= 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 &lt;= 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>

猜你喜欢

转载自blog.csdn.net/qq_38206090/article/details/82627235