读书人

spring的beanFactory跟factoryBean

发布时间: 2012-09-21 15:47:26 作者: rapoo

spring的beanFactory和factoryBean

转载自:http://blog.csdn.net/liuzhenwen/article/details/4155447

实例化容器Spring IoC容器的实例化非常简单,如下面的例子:
Resource resource = new FileSystemResource("beans.xml");BeanFactory factory = new XmlBeanFactory(resource);
?... 或...
ClassPathResource resource = new ClassPathResource("beans.xml");BeanFactory factory = new XmlBeanFactory(resource);
?... 或...
ApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"applicationContext.xml", "applicationContext-part2.xml"});// of course, an ApplicationContext is just a BeanFactoryBeanFactory factory = (BeanFactory) context;
?

3.2.2.1.?组成基于XML配置元数据将XML配置文件分拆成多个部分是非常有用的。为了加载多个XML文件生成一个ApplicationContext实例,可以将文件路径作为 字符串数组传给ApplicationContext构造器。而bean factory将通过调用bean defintion reader从多个文件中读取bean定义。通常情况下,Spring团队倾向于上述做法,因为这样各个配置并不会查觉到它们与其他配置文件的组合。另外一种方法是使用一个或多个的<beans> <import resource="services.xml"/> <import resource="resources/messageSource.xml"/> <import resource="/resources/themeSource.xml"/> <bean id="bean1" name="code"><!-- the factory bean, which contains a method called createInstance() --><bean id="myFactoryBean" factory-bean="myFactoryBean" factory-method="createInstance"/>??虽然设置bean属性的机制仍然在这里被提及,但隐式的做法是由工厂bean自己来管理以及通过依赖注入(DI)来进行配置。

使用容器从本质上讲,InputStream is = new FileInputStream("beans.xml");BeanFactory factory = new XmlBeanFactory(is);?基本上就这些了,接着使用BeanFactory的定义大致如下:

?

public interface BeanFactory {     Object getBean(String name) throws BeansException;     Object getBean(String name, Class requiredType) throws BeansException;      boolean containsBean(String name);      boolean isSingleton(String name) throws NoSuchBeanDefinitionException;      Class getType(String name) throws NoSuchBeanDefinitionException;      String[] getAliases(String name) throws     NoSuchBeanDefinitionException;}

?从这个接口的定义可以看出,BeanFactory是关注如何获取bean的,至于Bean的定义存在何处,怎样存储的,根本就不关心。这意味这Spring bean?的definition事实上可以存在Ldap里,可以存在DB里,非常的灵活,而不仅仅是XML文件。

?

public interface FactoryBean {    Object getObject() throws Exception;    Class getObjectType();    boolean isSingleton();}
?getObject()返回Factory管理的对象,注意并不是Factory本身的实例。Factory管理的对象可以是singleton的,也可以是prototype的,所以此接口有了另一个方法boolean isSingleton()用于区别是返回哪一种对象。getObjectType()最主要的目的就是在不创建实例的情况下就能知道欲创建的对象的类型。

?

从BeanFactory的定义可以看出,BeanFactory除了获取bean的功能外,还有bean的Type,bean的是否singleton的等特性,此外,前面分析已可以知道,getBean()可以返回singleton或prototype类型的实例。正是为了统筹管理这些bean创建相关的各种特性,才诞生了FactoryBean类。FactoryBean类主要是bean创建方面的一个统筹的管理。这是BeanFactory和FactoryBean的关系。

?