2015年12月17日 星期四

Setter-based 注入 與 實體參照 (Spring3.x 五)

參考文件

※Setter-based注入

使用 Setter-base 時,一定要有預設建構子,否則會 runtime-exception

Book.java

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

Comic.java

public class Comic {
    private String comicName;
    private int comicMoney;
    private Book book;
    
    public String getComicName() {
        return comicName;
    }
    
    public void setComicName(String comicName) {
        System.out.println("comicName=" + comicName);
        this.comicName = comicName;
    }
    
    public int getComicMoney() {
        return comicMoney;
    }
    
    public void setComicMoney(int comicMoney) {
        System.out.println("comicMoney=" + comicMoney);
        this.comicMoney = comicMoney;
    }
    
    public Book getBook() {
        return book;
    }
    
    public void setBook(Book book) {
        System.out.println("book=" + book.getBookName());
        this.book = book;
    }
}

applicationContext.xml

<bean id="book" class="book.vo.Book" p:comic-ref="comic">
    <property name="bookName">
        <value>三國志</value>
    </property>
    
    <property name="bookMoney" value="620" />
</bean>
    
<bean id="comic" class="book.vo.Comic" p:comicName="七龍珠" p:comicMoney="85" p:book-ref="book" />

測試類

ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
    
Comic comic = (Comic) ctx.getBean("comic");
System.out.println(comic.getBook().getBookName());
System.out.println(comic.getBook().getBookMoney());
    
((ClassPathXmlApplicationContext) ctx).close();

※結果:
book=null
comicMoney=85
comicName=七龍珠
三國志
620

※comic的「p:」,必須在Hello World (Spring3.x 一)的標頭有Namespaces的圖,勾p的checkbox,就會在xml上方出現一些設定,這時才可以用這種寫法

※最後兩行是在測試類才run的到的程式碼,但第一次book=null,所以在啟動時是無法取得對方的內容的


※屬性第一個字與第二個字的問題

Book.java

public class Book {
    private String aBc;
    
    public String getaBc() {
        return aBc;
    }
    
    public void setaBc(String aBc) {
        this.aBc = aBc;
    }
}

applicationContext.xml

<bean id="book" class="book.vo.Book" p:aBc="abc" />

※在網路上有人說前二個字必需全大寫或全小寫,像我這個例子就沒有,有人說啟動時spring會報錯,但我試的結果並沒有,setter/getter我都用eclipse自動產生,xml也有提示可用,我試著把第一個字改成大寫,都還是可以,可能是版本的差異吧!



※實體參照

有五個特殊字在設定XML時有可能會錯誤,可以用以下的方法取代(建構子注子和Setter-based 注入都可以這樣用)
<:&lt;
>:&gt;
&:&amp;
":&quot;
':&apos;

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

applicationContext.xml
<bean id="book1" class="book.vo.Book">
    <property name="spcialString">
        <value>&lt;</value>
    </property>
</bean>
    
<bean id="book2" class="book.vo.Book">
    <property name="spcialString">
        <value><![CDATA[<]]></value>
    </property>
</bean>
    
<bean id="book3" class="book.vo.Book">
    <property name="spcialString">
        <value>
            <![CDATA[
                <
            ]]>
        </value>
    </property>
</bean>

測試類
ApplicationContext appContext = new ClassPathXmlApplicationContext("applicationContext.xml");
    
Book book1 = (Book) appContext.getBean("book1");
Book book2 = (Book) appContext.getBean("book2");
Book book3 = (Book) appContext.getBean("book3");
    
System.out.println(book1.getSpcialString());
System.out.println(book2.getSpcialString());
System.out.println(book3.getSpcialString());
    
((ClassPathXmlApplicationContext) appContext).close();

※結果:
<
<


<



※book3因為在xml設定有換行,所以也會換行,可以用trim()或者用book1或book2的方式就好了,不然真的很難看

沒有留言:

張貼留言