5.1FactoryBean的使用

一般情况下,Spring通过反射机制利用bean的class属性指定实现类来实例化bean。在某些情况下,实例化bean的过程比较复杂,如果按照传统的方式,则需要在<bean>中提供大量的配置信息。配置方式的灵活性是受限的,Spring为此提供了一个org.SpringFramwork.bean.factory.Factory的工厂类接口,用户可以通过实现该接口定制实例化bean的逻辑。
FactoryBean接口定义了3个方法:
  • T getObject():返回有FactoryBean创建的bean实例,如果isSingleton返回true,则该实例会放到Spring容器中单实例缓存池中。
  • boolean isSingleton():返回有FactoryBean创建的bean实例的作用域是singleton还是prototype。
  • class<T> getObjectType():返回FactoryBean创建的bean类型。
当配置文件中<bean>的class属性配置的实现类FactoryBean时,通过getBean()方法返回的不是FactoryBean本身,而是FactoryBean#getObject()方法所返回的对象,相当于FactoryBean#getObject()代理了getBean方法。
示例:
public class Car{
     private int maxSpeed;
    private String brand;
    private double price;
}

public class CarFactoryBean implements FactoryBean<Car>{
     private String carInfo;
    public Car getObject() throw Exception{
        Car car = new Car();
        String[] infos = carInfo.split(",");
        car.setBrand(infos[0]);
        car.setMaxSpeed(infos[1]);
        car.setprice(Double.valueOf(infos[2]));
        return car;
    }
    public Class<T> getObjectType(){
        return Car.class;    
    }
    public boolean isSingleton(){
         return false;   
    }
    public String getCarInfo(){
         return this.carInfo; 
    }
    public void setCarInfo(String carInfo){
         this.carInfo = carInfo;   
    }
}

XML配置
<bean id="car" class="CarFactoryBean" carInfo="保时捷,218,1280000"></bean>
当调用getBean("car")时,Spring通过反射机制发现CarFactory实现了FactoryBean的接口,这时Spring容器就调用接口方法CarFactoryBean#getObject()返回。如果希望获取CarFactoryBean的实例,则需要使用getBean(beanName)方法时在beanName前加"&".





posted @ 2021-01-13 17:11  _Shing  阅读(225)  评论(0)    收藏  举报