入門 06 - Bean定義檔進階讀取 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
BeanFactory可以接受InputStream作爲建構函式的參數,也可以接受實作 org.springframework.core.io.Resource接口的對象作爲參數,像是ClassPathResource、 FileSystemResource、InputStreamResource、ServletContextResource、 UrlResource,在不同的場合可以使用對應的類別,以ClassPathResource爲例:
Resource resource = new ClassPathResource("bean.xml");
BeanFactory factory = new XmlBeanFactory(resource);
HelloBean hello = (HelloBean) factory.getBean("helloBean");
....
在bean定義檔中如果有多個bean的定義,而您想要一次取回所有的bean,則您可以使用 org.springframework.beans.factory.ListableBeanFactory,藉由其對應的方法取回所有對應的 bean對象,例如若bean定義檔中的內容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="helloBeanOfJustin" class="onlyfun.caterpillar.HelloBean">
<property name="helloWord"><value>Hello!Justin!</value></property>
</bean>
<bean id="helloBeanOfcaterpillar" class="onlyfun.caterpillar.HelloBean">
<property name="helloWord"><value>Hello!caterpillar!</value></property>
</bean>
</beans>
則我們可以根據型態一次取回所有的bean對象,例如:
Resource resource = new ClassPathResource("bean.xml");
ListableBeanFactory factory = new XmlBeanFactory(resource);
Map helloBeans = factory.getBeansOfType(HelloBean.class, false, false);
您可以看看API文件瞭解getBeansOfType()或其它ListableBeanFactory的方法使用方式。
將所有的bean定義全部寫在一個bean定義文件只對小型的程序可行,對於大型的應用程序來說,所需要的bean量是非常大的,我們不可能將之撰寫在同一 個定義檔中,之前的方法將一個定義檔綁定至一個BeanFactory中,BeanFactory的創建需要耗費資源,這個方法顯然不可行。
我們可以使用org.springframework.beans.factory.xml.XmlBeanDefinitionReader來進行多 個定義檔的加載,它需要一個實作 org.springframework.beans.factory.support.BeanDefinitionRegistry接口的對象作爲建 構時的參數,例如 org.springframework.beans.factory.support.DefaultListableBeanFactory, XmlBeanDefinitionReader使用一個BeanDefinitionRegistry類型的對象來註冊多個bean定義檔,我們不用爲 每個bean定義檔創建一個BeanFactory。
舉個使用的實際例子:
BeanDefinitionRegistry reg = new DefaultListableBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(reg);
// 加載bean定義檔
reader.loadBeanDefinitions(new ClassPathResource("bean1.xml"));
reader.loadBeanDefinitions(new ClassPathResource("bean2.xml"));
....
// 取得Bean
BeanFactory bf = (BeanFactory) reg;
Object o = bf.getBean("helloBean");
....
DefaultListableBeanFactory同時實作BeanDefinitionRegistry、BeanFactory、 ListableBeanFactory等接口,爲了能使用BeanFactory的功能,我們必須轉換操作的界面,就如上面的程序所示。
暫時介紹到這邊,有任何值得介紹的定義檔讀取方式,將隨時補充於此。