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 的資料夾,用「..」(上一層)是沒用的
沒有留言:
張貼留言