Spring 裝配Bean

普通裝配方式

聲明Bean

public class User {

    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public User(int age) {
        this.age = age;
    }

    public void sayAge(){
        System.out.println("age->" + age);
    }
}

通過構造器注入

springTest.xml 中配置:

<bean id="duke" class="類的完全限定名">
  <constructor-arg value="15">
  <!--如果需要傳入引用對象-->
  <constructor-arg ref="引用對象在xml中的id"
</bean>

main 方法中配置:

ApplicationContext ctx = new ClassPathXmlApplicationContext("springTest.xml");
        User user = (User) ctx.getBean("tom");
        user.sayAge();

Bean的作用域

如果我們需要讓Spring在每次請求時都為Bean產生一個新實例,需要配置Bean的scope

<bean id="ticket" class="..." scope="prototype" />

Spring還提供了其他幾個作用域選項:

  1. singleton: 在每一個Spring容器中,一個Bean定義只有一個對象示例(默認)
  2. prototype: 允許Bean的定義可以被實例化任意次(每次調用都創建一個示例)
  3. request: 在一次HTTP請求中,每個Bean定義對應一個實例,該作用域僅在基于Web的Spring上下文(例如Spring MVC)中才有效
  4. session: 在一次HTTP Session中,每個Bean定義對應一個實例,該作用域僅在基于Web的Spring上下文(例如Spring MVC)中才有效
  5. global-session: 在一個全局HTTP Session中,每個Bean定義對應一個實例,該作用域僅在基于Web的Spring上下文(例如Spring MVC)中才有效

初始化和銷毀Bean

<bean id="..." class="..."
    init-method="初始化后方法名"
    destory-method="銷毀前調用的方法"
/>

還可以配置默認的init-method和destory-method:

<?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">

       default-init-method="默認初始化方法"
       default-default-method="默認銷毀前調用的方法"


</beans>

注入Bean屬性

Bean的聲明:

public class User {

    private String name;
    private int age;

    public User() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public User(int age) {
        this.age = age;
    }

    public void sayAge(){
        System.out.println("age->" + age);
    }

    public void sayName() {
        System.out.println("name->" + name);
    }
}

xml中的配置:

<bean id="jack" class="User">
        <constructor-arg value="19"/>
        <property name="name" value="Jack" />
        <!--如果需要引用其他對象-->
        <property name="..." ref="..." />
</bean>

使用Spring的命名空間p裝配屬性

在xml的根標簽beans加上以下聲明:

xmlns:p="http://www.springframework.org/schema/p"

使用方式:

<bean id="jack" class="User"
  p:name = "Jack"
  <!--如果需要屬性為引用對象-->
  p:poem-ref = "poem"
/>


裝配集合

Java中共有4中數據集合,分別是:

  • List: 裝配list類型的值,允許重復
  • Set: 裝配set類型的值,不允許重復
  • Map: 裝配map類型的值,名稱和值可以是任意類型
  • pros: 裝配properties類型的值,名稱和值必須是String類型

以下是裝配 List,Set,Array 的例子

<bean id="libai" class="User">
        <property name="poems">
            <list>

                <ref bean="tangshi" />
                <ref bean="songci" />
                <ref bean="yuanqu" />

            </list>
        </property>
</bean>

以下是裝配 Map 的例子

<bean id="libai" class="User">
        <property name="poems">
            <map>
                <entry key="tangshi" value-ref="tangshi" />
                <entry key="songci" value-ref="songci" />
                <entry key="yuanqu" value-ref="yuanqu"/>
            </map>
        </property>
</bean>

以下是裝配 properties 的例子


<bean id="libai" class="User">
    <property name="poems">
        <props>
            <prop key="tangshi">唐詩三百首</prop>
            <prop key="songci">宋詞五百首</prop>
            <prop key="yuanqu">元曲一千首</prop>
        </props>
    </property>
    <!--設定某屬性為空-->
    <property name="someThingNull"><null/></property>  
</bean>

使用SpEL表達式裝配

字面值

<!--整形-->
<property name="count" value="#{5}" />
<!--混用-->
<property name="message" value="This count is #{5}"/>
<!--浮點型-->
<property name="floatNum" value="#{89.7}"/>
<!--科學計數法-->
<property name="longNum" value="#{1e4}"/>
<!--字符串-->
<property name="str" value="#{'String'}"/>
<!--布爾型-->
<property name="enabled" value="#{false}"/>

引用Bean,properties和方法

<!--引用Bean-->
<property name="BeanID" value="#{Bean}"/>
<!--等同于-->
<property name="BeanID" ref="Bean"/>

<!--引用方法-->
<property name="song" value="#{songSelector.selectSong()}"/>

<!--將返回值全部轉換為大寫-->
<property name="song" value="#{songSelector.selectSong().toUpperCase()}"/>
<!--避免NullPointerException異常-->
<property name="song" value="#{songSelector.selectSong()?.toUpperCase}"/>

操作類

在SpEL中,使用 T() 運算符會調用類的作用域的方法和常量

<!--調用常量-->
<property name="PI" value="#{T(java.lang.Math).PI}"/>
<!--調用方法-->
<property name="randomNum" value="#{T(java.lang.Math).random()}"/>

在SpEL上執行操作

<property name="arithmetic" value="#{counter.total + 43}"/>
<property name="arithmetic" value="#{counter.total - 43}"/>
<property name="arithmetic" value="#{2 * T(java.lang.Math).PI}"/>
<property name="arithmetic" value="#{counter.total / counter.count}"/>
<property name="arithmetic" value="#{counter.total % 20}"/>
<!--SpEL還提供了平方運算-->
<property name="arithmetic" value="#{T(java.lang.Math).PI ^ 2}"/>
<!--執行字符串鏈接-->
<property name="str" value="user.firstName + ' ' + user.lastName"/>

<!--比較值-->
<property name="equal" value="#{counter.total == 1000}"/>
<!--大于等于和小于等于在XML中有特殊含義,SpEL表達式提供了語義化的表達式-->
<!--小于等于-->
<property name="equal" value="#{counter.total le 1000}"/>
<!--大于等于-->
<property name="equal" value="#{counter.total ge 1000}"/>

邏輯表達式

  1. and
  2. or
  3. not或!

條件表達式

與Java中的三目運算符相同

正則表達式

運算符號 : matches

訪問集合成員

<!--提取集合中的元素-->
<property name="city" value="#{cities[2]}"/>
<!--隨機提取元素-->
<property name="city" value="#{cities[T(java.lang.Math).randow() * cities.size()]}"/>
<!--獲取Map中的成員-->
<property name="city" value="#{cities['beijing']}"/>

篩選集合成員

<!--篩選人數大于等于10萬的城市集合-->
<property name="bigCities" value="#{cities.?[population gt 100000]}"/>
<!--篩選第一個符合條件的集合-->
<property name="bigCities" value="#{cities.^[population gt 100000]}"/>
<!--篩選最后一個符合條件的集合-->
<property name="bigCities" value="#{cities.$[population gt 100000]}"/>

投影集合

集合投影是從集合的每一個成員中選擇特定的屬性放入一個新的集合中。
例如我們僅僅需要包含城市名稱的一個String類型集合,而不是City對象集合,就需要如下操作

<property name="cityName" value="#{cities.![name]}"/>

如果需要得到城市名字和國家名稱的集合,比如返回"Beijing,China","NewYork,America"這樣的結果

<property name="cityName" value="#{cities.![name + ',' + state]}"/>
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,993評論 19 139
  • Spring Boot 參考指南 介紹 轉載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,973評論 6 342
  • 文章作者:Tyan博客:noahsnail.com 3.4 依賴 標準企業應用不會由一個對象(或Spring用語中...
    SnailTyan閱讀 1,210評論 0 1
  • Spring容器負責創建應用程序中的bean并通過DI來協調這些對象之間的關系,我們需要做的就是告訴Spring要...
    xdoyf閱讀 510評論 0 1
  • 月圓是想念、是思念、是祈盼、是幸福、是團圓。沒有昂貴的月餅給大家,只是以文表達思與念,愿各自安好,千里共嬋娟。 中...
    小小sha閱讀 278評論 0 2