1. 程式人生 > >XML方式SpEL方法注入(07)

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>