2015年12月24日 星期四

util: (Spring3.x 十)

針對這篇內部 bean 和 Collection (Spring3.x 七),官方還是一種util的寫法,必需在namespace頁籤勾util才能用,和之前的p:和c:同一個頁籤
<bean id="book" class="book.vo.Book">
    <property name="comicNames">
        <util:set>
            <value>七龍珠</value>
            <value>滾球王</value>
            <value>通靈王</value>
            <value>滾球王</value>
        </util:set>
    </property>
    
    <property name="prices">
        <util:list>
            <value type="java.lang.Integer">65</value>
            <value type="java.lang.Integer">70</value>
            <value type="int">75</value>
            <value type="int">70</value>
        </util:list>
    </property>
    
    <property name="comicNameAndPrice">
        <util:map>
            <entry key="七龍珠" value="65" />
            <entry key="滾球王" value="70" />
            <entry>
                <key>
                    <value>通靈王</value>
                </key>
                <value>75</value>
            </entry>
        </util:map>
    </property>
    
    <property name="prop">
        <util:properties>
            <prop key="aaa">111</prop>
            <prop key="bbb">222</prop>
            <prop key="ccc">333</prop>
        </util:properties>
    </property>
</bean>

※測試的結果還是一樣

※util:properties還可以連結外面的檔案,如下:

xxx.ooo

apple=\u860B\u679C
banana=\u9999\u8549

applicationContext.xml

<property name="prop">
    <util:properties location="classpath:properties/xxx.ooo" />
</property>

※properties是我的package名稱,\u開頭的可用native2ascii.exe,在安裝java目錄的bin下,或者在Eclipse增加Spring tools做完,直接打字也可以幫我們轉換

※結果:
{banana=香蕉, apple=蘋果}


※其他屬性

list-class

以List為例,<util:list id="emails" list-class="java.util.LinkedList">list-class就是多型,以java的寫法就是List emails = new LinkedList();
而Map的屬性叫 map-class;Set的叫set-class

整個util不只能寫在bean裡,也可和bean同層,取個id後,然後用@Resource(name="id")就可以將值放進去

value-type

value-type屬性類似泛型

塞物件


<util:list id="xxx" value-type="java.lang.String">
    <value>ooo</value>
    <ref bean="cb" />
    <ref bean="bo" />
    <ref bean="ch" />
</util:list>
    
<bean id="bo" class="vo.Book" p:emails-ref="xxx" />
<bean id="cb" class="vo.ComicBook" />
<bean id="ch" class="vo.Chess" />



※util:constant

參考文件
看到constant就知道是和static有關

Book.java

public class Book {
    private String bookStaFin;
    // setter/getter...
}

XXX.java

public class XXX {
    public static final String OOO = "XOXOX";
}

applicationContext.xml

<bean id="book" class="book.vo.Book">
    <!-- 方法一 -->
    <property name="bookStaFin">
        <bean id="book.vo.XXX.OOO" class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean" />
    </property>
    
    <!-- 方法二 -->
    <!-- <property name="bookStaFin"> -->
    <!--     <util:constant static-field="book.vo.XXX.OOO" /> -->
    <!-- </property> -->
    
    <!-- 方法三 -->
    <!-- <property name="bookStaFin" ref="ooo" /> -->
</bean>
    
<!-- 方法三 -->
<!-- <util:constant static-field="book.vo.XXX.OOO" id="ooo" /> -->

測試類
ApplicationContext appContext = new ClassPathXmlApplicationContext("applicationContext.xml");
    
Book book = (Book) appContext.getBean("book");
System.out.println(book.getBookStaFin());
    
((ClassPathXmlApplicationContext) appContext).close();

※方法一是還沒有util的時候用的,class一定要是FieldRetrievingFactoryBean

※方法二和方法三(要打開兩個)就是一個寫裡面一個寫外面而已

※book.vo是package名稱,XXX是Class名稱,OOO是filed名稱




※util:property-path

參考文件
一個bean已經有實體了,所以可以取得裡面的方法,而java就直接「.」就可以了,在XML就是現在要介紹的方法,總之就是可以讓我們用id或name一直點下去取值

Book.java

public class Book {
    private String bookName;
    private Comic comic;
    // setter/getter...
}

Comic.java

public class Comic {
    private String comicName;
    // setter/getter...
}

applicationContext.xml

<bean id="book" class="book.vo.Book">
    <property name="bookName" value="資治通鑑"/>
    <property name="comic">
        <bean class="book.vo.Comic" p:comicName="七龍珠" />
    </property>
</bean>
    
<!-- 方法一 -->
<bean id="book.bookName" class="org.springframework.beans.factory.config.PropertyPathFactoryBean" />
<bean id="book.comic" class="org.springframework.beans.factory.config.PropertyPathFactoryBean" />
    
<!-- 方法二 -->
<util:property-path id="xxx" path="book.bookName"/>
<util:property-path id="ooo" path="book.comic"/>

測試類

ApplicationContext appContext = new ClassPathXmlApplicationContext("applicationContext.xml");
    
// 方法一
System.out.println(appContext.getBean("book.bookName"));
Comic comic1 = (Comic) appContext.getBean("book.comic");
System.out.println(comic1.getComicName());
    
// 方法二
System.out.println(appContext.getBean("xxx"));
Comic comic2 = (Comic) appContext.getBean("ooo");
System.out.println(comic2.getComicName());
    
((ClassPathXmlApplicationContext) appContext).close();

※結果:
資治通鑑
七龍珠
資治通鑑
七龍珠

※方法一是還沒有util的時候用的,class一定要是PropertyPathFactoryBean

※方法一的缺點是id不能自訂,但方法二的id就可以自訂了

沒有留言:

張貼留言