2015年12月24日 星期四

autowire (Spring3.x 十一)

參考文件


Book.java

public class Book {
    private Comic comic;
    
    public Book() {}
    
    public Book(Comic comic) {
        this.comic = comic;
    }
    
    // setter/getter...
}

Comic.java

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

applicationContext.xml

<!-- <bean name="ooo" class="book.vo.Comic" p:comicName="七龍珠" /> -->
<!-- <bean name="book1" class="book.vo.Book" autowire="byType" /> -->
    
<bean name="comic" class="book.vo.Comic" p:comicName="滾球王" />
<bean id="book2" class="book.vo.Book" autowire="byName" />
    
<bean name="xxx" class="book.vo.Comic" p:comicName="通靈王" />
<bean id="book3" class="book.vo.Book" autowire="constructor" />

測試類

ApplicationContext appContext = new ClassPathXmlApplicationContext("applicationContext.xml");
    
Book book = (Book) appContext.getBean("book2");
if (book.getComic() != null) {
    System.out.println(book.getComic().getComicName());
}
    
((ClassPathXmlApplicationContext) appContext).close();

※我試的結果byType和另外其中一種混用,就會出「org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [book.vo.Comic] is defined: expected single matching bean but found 2: ooo,comic」的錯
因為byType是根據型態,只要是class裡的field有的型態都會去抓,沒抓到不會報錯,只是null而已,但抓到2個以上就會報錯,因為它不知道要抓哪個

※byName是根據名稱,只要是class裡的名稱和xml的name、id、alias一樣就會去抓,沒抓到不會報錯,只是null而已
不用擔心name和id名稱都一樣的問題,run起來console就會說不能重覆了

※constructor是根據建構子的型態,一定要剛好是一個,沒有或超過都會報錯
我試的結果不管byName寫在constructor上面或下面,都會被byName覆蓋,

沒有留言:

張貼留言