入门 06 - 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的功能,我们必须转换操作的界面,就如上面的程序所示。
暂时介绍到这边,有任何值得介绍的定义档读取方式,将随时补充于此。