`

Bean定義檔進階讀取

阅读更多

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的功能,我們必須轉換操作的介面,就如上面的程式所示。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics