FactoryBean的使⽤
⼀般情况下,Spring通过反射机制利⽤bean的class属性指定实现类来实例化bean 。在某些情况下,实例化bean过程⽐较复杂,如果按照传统的⽅式,则需要在<bean>中提供⼤量的配置信息,配置⽅式的灵活性是受限的,这时采⽤编码的⽅式可能会得到⼀个简单的⽅案。Spring为此提供了⼀个org.Springframework.bean.factory.FactoryBean的⼯⼚类接⼝,⽤户可以通过实现该接⼝定制实例化bean的逻辑。FactoryBean接⼝对于Spring框架来说占有重要的地位,Spring ⾃⾝就提供了70多个FactoryBean的实现。它们隐藏了实例化⼀些复杂bean 的细节,给上层应⽤带来了便利。从Spring 3.0 开始, FactoryBean开始⽀持泛型,即接⼝声明改为FactoryBean<T> 的形式:
package org.Springframework.beans.factory;
public interface FactoryBean<T> {
T getObject() throws Exception;
Class<?> getObjectType();
boolean isSingleton();
}
在该接⼝中还定义了以下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()⽅法。例如:如果使⽤传统⽅式配置下⾯Car 的<bean>时,Car的每个属性分别对应⼀个<property>元素标签。
public class Car  {
private int maxSpeed ;
private  String brand ;
private double price ;
//get/set⽅法
如果⽤FactoryBean的⽅式实现就会灵活⼀些,下例通过逗号分割符的⽅式⼀次性地为Car的所有属性指定配置值:
public class CarFactoryBean implements FactoryBean<Car> {
private String carInfo;
public Car getObject() throws Exception {
Car car = new Car();
String[] infos = carInfo.split(",");
car.setBrand(infos[0]);
car.setMaxSpeed(Integer.valueOf(infos[1]));
car.setPrice(Double.valueOf(infos[2]));
return car;
}
public Class<Car> getObjectType() {
return Car.class;
}
public boolean isSingleton() {
return false;
}
}
有了这个CarFactoryBean后,就可以在配置⽂件中使⽤下⾯这种⾃定义的配置⽅式配置Car Bean了:
<bean id="car"class="st.factorybean.CarFactoryBean" carInfo="⼤众SUV,180,180000"/>springframework作用
当调⽤getBean("car") 时,Spring通过反射机制发现CarFactoryBean实现了FactoryBean的接⼝,这时Spring容器就调⽤接⼝⽅法CarFactoryBean#getObject()⽅法返回。如果希望获取CarFactoryBean的实例,则需要在使⽤getBean(beanName) ⽅法时在beanName前显⽰的加上 "&" 前缀,例如getBean("&car")。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。