配置工厂Bean
通常由应用程序直接使用new创建新的对象,为了将对象的创建和使用相分离,采用工厂模式,即应用程序将对象的创建及初始化职责交给工厂对象.
一般情况下,应用程序有自己的工厂对象来创建bean.如果将应用程序自己的工厂对象交给Spring管理,那么Spring管理的就不是普通的bean,而是工厂Bean.
调用getBean()方法,Spring返回的不是直接创建的Bean的实例,而是由工厂Bean创建的Bean实例.
一般在Spring中配置工厂Bean,有3中不同类型的工厂Bean的配置.
1.静态工厂
创建具体Bean实例的是静态方法
public class StaticFactoryBean{
public staticInteger createRandom(){
return newInteger(new Random().nextInt());
}
}
将其纳入Spring容器来管理,需要通过factory-method指定静态方法名称
<bean id="random" class="example.chapter3.StaticFactoryBean" scope="prototype"
factory-method="createRandom"//createRandom方法必须是static的,才能找到 />
2.实例工厂
创建具体Bean实例的是实例,不是静态方法
publicclass InstanceFactoryBean {
privateString format = "yy-MM-dd HH:mm:ss";
publicvoid setFormat(String format) { this.format = format; }
publicString createTime() { return new SimpleDateFormat(format).format(new Date()); }
}
配置文件需要配置两个bean:第一个Bean和普通的Bean没有区别,第二个bean定义如何通过工厂Bean获取Bean,需要指定工厂Bean的名称和方法名称
<bean id="instanceFactoryBean"class="example.chapter3.InstanceFactoryBean"><property name="format" value="yyyy-MM-dd HH:mm:ss"/></bean>
<bean id="currentTime"factory-bean="instanceFactoryBean"factory-method="createTime"/>
3.实现FactoryBean接口
publicclass PiFactoryBean implements FactoryBean {
publicObject getObject() throws Exception { return new Double(3.14159265358979); }
publicClass getObjectType() { return Double.class; }
publicboolean isSingleton() { return true; }
}
实现了FactoryBean接口的Bean,不再被视为普通的Bean.Spring会自动检测.