【Spring】普通bean、FactoryBean、BeanFactory的区别与联系

来源:互联网 发布:手机看本子的软件 编辑:程序博客网 时间:2024/05/24 01:44

在Spring中这三点比较容易混淆:

一. FactoryBean、BeanFactory的区别

其实这两点没有什么联系,只是命名上比较相似,所以常常被拿出来比较。

BeanFactory

BeanFactory是IOC最基本的容器,负责生产和管理bean,它为其他具体的IOC容器实现提供了最基本的规范,例如DefaultListableBeanFactory, XmlBeanFactory, ApplicationContext 等具体的容器都是实现了BeanFactory,再在其基础之上附加了其他的功能。

下面可以看看BeanFactory提供的基本功能:

public interface BeanFactory {        String FACTORY_BEAN_PREFIX = "&";        Object getBean(String name) throws BeansException;        <T> T getBean(String name, Class<T> requiredType) throws BeansException;        <T> T getBean(Class<T> requiredType) throws BeansException;        Object getBean(String name, Object... args) throws BeansException;        boolean containsBean(String name);        boolean isSingleton(String name) throws NoSuchBeanDefinitionException;        boolean isPrototype(String name) throws NoSuchBeanDefinitionException;        boolean isTypeMatch(String name, Class<?> targetType) throws NoSuchBeanDefinitionException;        Class<?> getType(String name) throws NoSuchBeanDefinitionException;        String[] getAliases(String name);    } 

FactoryBean

FactoryBean是一个接口,当在IOC容器中的Bean实现了FactoryBean接口后,通过getBean(String BeanName)获取到的Bean对象并不是FactoryBean的实现类对象,而是这个实现类中的getObject()方法返回的对象。要想获取FactoryBean的实现类,就要getBean(&BeanName),在BeanName之前加上&。

FactoryBean源码

public interface FactoryBean<T> {        T getObject() throws Exception;        Class<?> getObjectType();        boolean isSingleton();    }  

区别

通过以上源码和示例来看,基本上能印证以下结论,也就是二者的区别。

  1. BeanFactory是个Factory,也就是 IOC 容器或对象工厂,所有的 Bean 都是由 BeanFactory( 也就是 IOC 容器 ) 来进行管理。

  2. FactoryBean是一个能生产或者修饰生成对象的工厂Bean(本质上也是一个bean),可以在BeanFactory(IOC容器)中被管理,所以它并不是一个简单的Bean。当使用容器中factory bean的时候,该容器不会返回factory bean本身,而是返回其生成的对象。要想获取FactoryBean的实现类本身,得在getBean(String BeanName)中的BeanName之前加上&,写成getBean(String &BeanName)。

原创粉丝点击