2015年12月16日 星期三

XML的 id、name、alias、import、繼承、placeholder (Spring3.x 三)

applicationContext.xml

<import resource="xxx.xml" />
    
<bean class="book.vo.Book" id="book,book3" name="a, b,c">
    <property name="bookName" value="Spring in Action" />
    
    <property name="bookMoney">
        <value>500</value>
    </property>
</bean>
    
<bean class="book.vo.Comic" id="comic" p:comicMoney="65" p:comicName="七龍珠" name="c"/>
    
<alias name="b" alias="xxx" />
<alias name="xxx" alias="ooo" />

測試類:

ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
Book book = (Book) ctx.getBean("book,book3");
System.out.println(book.getInfo());
((ClassPathXmlApplicationContext) ctx).close();

※name可以一次取多個名稱,用「,」隔開,中間可空隔 (網路上很多人說不行空,不過我試的結果就是這樣,可能版本有差吧!)
使用時只要ctx.getBean("b")就可以了

※id無法一次取多個名稱,如上的程式,使用時要ctx.getBean("book,book3")

※<bean>的 name 和 id 重覆都會出現「org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Bean name 'a' is already used in this <beans> element Offending resource: class path resource [applicationContext.xml]」的錯! (網路上很多人說name可以重覆,後者會蓋前者,但我試就是不行,可能版本有差吧!)

※alias的name要對應bean的name或id或其他的alias的alias
可以對應name的其中一個,但不能全部,如上面的b就是a, b,c的其中一個,使用時只要ctx.getBean("xxx或ooo");就可以了

※最上面的 import 就是把其他的 spring 設定檔抓進來

※annotation 也有個 @Import,但他是將沒有標 @Component 類似這樣的,也可以將其給 spring 管理,id 名為套件名+類別名;@ImportResource 才是這裡說的



※繼承

※parent

<bean id="b" class="Book" p:bookName="七龍珠" p:bookMoney="65" />
<bean id="cb" class="ComicBook" parent="b" />

※java 裡的 ComicBook 不用真的去繼承 Book,這裡指的是 xml 的繼承

※cb 繼承 b 後,class、bookName、bookMoney都繼承了,但 cb 還是可以覆寫

※有些屬性還是沒有繼承,如 abstract、autowire

※abstract

<bean id="b" class="Book" p:bookName="七龍珠" p:bookMoney="65" abstract="true" />
<bean id="cb" parent="b" />

※寫後 abstract 後,就不能用 getBean 去取得了,通常是把它當做模版使用


※placeholder

可以連接一般的文字檔,然後用「${}」去抓

<context:property-placeholder location="classpath:text/xxx.txt" />
<bean id="b" class="Book" p:bookName="${a}" p:bookMoney="65" />
<bean id="cb" class="ComicBook" p:bookName="${b}" p:bookMoney="50" />

※注意classpath:後面的路徑是在 src下,如果是 maven 或 gradle 是在 src\main\java下,此例是在這下面又增加一個 text 的資料夾,用「..」(上一層)是沒用的

沒有留言:

張貼留言