Spring BeanFactory与FactoryBean的区别

1. BeanFactory

  以Factory结尾,表示它是一个工厂类(接口),用于管理Bean的一个工厂。在Spring中,BeanFactory是IOC容器的核心接口,它的职责包括:实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。

  Spring为我们提供了许多易用的BeanFactory实现比如XmlBeanFactory就是常用的一个,该实现将以XML方式描述组成应用的对象及对象间的依赖关系。

BeanFactory提供的方法及其简单,仅提供了六种方法供客户调用:

  •   boolean containsBean(String beanName) 判断工厂中是否包含给定名称的bean定义,若有则返回true
  •   Object getBean(String) 返回给定名称注册的bean实例。根据bean的配置情况,如果是singleton模式将返回一个共享实例,否则将返回一个新建的实例,如果没有找到指定bean,该方法可能会抛出异常
  •   Object getBean(String, Class) 返回以给定名称注册的bean实例,并转换为给定class类型
  •   Class getType(String name) 返回给定名称的bean的Class,如果没有找到指定的bean实例,则排除NoSuchBeanDefinitionException异常
  •   boolean isSingleton(String) 判断给定名称的bean定义是否为单例模式
  •   String[] getAliases(String name) 返回给定bean名称的所有别名。

2. FactoryBean

  以Bean结尾,表示它是一个Bean,不同于普通Bean的是:它是实现了FactoryBean接口的Bean。FactoryBean接口定义了以下3个接口方法: 

  1.    Object getObject():返回有FactoryBean创建的Bean实例,如果isSingleton()返回true,则该实例会放到Spring容器的单实例缓存池中。 
  2.    boolean isSingleton():确定由FactoryBean创建Bean的作用域是singleton还是prototype. 
  3.    Class getObjectType():返回FactoryBean创建Bean的类型。 

    当配置文件中 的class属性配置的实现类是FactoryBean时,通过getBean方法返回的不是FactoryBean本身,而是 FactoryBean.getObject()方法所返回的对象,相当于FactoryBean#getObject()代理了getBean()方法

如果用户希望获取 FactoryBean的实例,则需要在使用getBean(beanName)方法时显式地在beanName前加上“&”前缀.

一个例子如下:

 
    
 
  import org.springframework.beans.factory.FactoryBean; 
 
    public class CarFactoryBean implements FactoryBean{ 
       private String carInfo; 
       public Stirng getCarInfo() { 
       return carInfo; 
     } 
 
      public void setCarInfo(String carInfo) {  
       this.carInfo=carInfo;  
     } 
 
     public Object getObject()throws Exception{  
        Car car=new Car();  
          ..... 
 
        return car;  
   } 
     public Class getObjectType(){ 
         return Car.class; 
   } 
 
    public boolean isSingleton() { 
     return true; 
    } 
} 

 

当调用getBean("car")时,Spring通过反射机制发现CarFactoryBean实现了FactoryBean的接口,这时 Sping容器就调用接口方法CarFactoryBean#getObject()返回工厂类创建的对象。如果用户希望获取 CarFactoryBean的实例,则需要在使用getBean(beanName)方法时显式地在beanName前加上“&”前 缀:getBean("&car").
 

你可能感兴趣的:(spring)