spring FactoryBean
在面向接口编程时,当我们程序依赖第三方类库,需要实例化并使用第三类库中的相关类时,通常使用工厂方法模式,通过工厂类来来实例化具体的接口实现类,这时我们对象依赖
无法直接注入,FactoryBean即为解决此种性况而生。
(1)针对静态工厂方法类返回的实现
<bean id="yourbean" class ="">
<property>
<!--此处引入第三方类库的实现类-->
<ref bean="interfaceImpl"/>
</property>
</bean>
<!--此处定义第三方类库接口实现的bean-->
<bean id="interfaceImpl" class="...InterfaceFactory" factory-method="getInstance"/>
注:InterfaceFactory为第三方类库提供的生成其接口实现的静态工厂类,生成实现对象的方法为getInstance
(2)针对非静态工厂方法
<bean id="yourbean" class ="">
<property>
<!--此处引入第三方类库的实现类-->
<ref bean="interfaceImpl"/>
</property>
</bean>
<!--这里定义非静态工厂类的bean-->
<bean id="interfaceFactory" class="...InterfaceFactory"/>
<!--此处定义第三方类库接口实现的bean-->
<bean id="interfaceImpl" factory-bean="interfaceFactory" factory-method="getInstance"/>
注:InterfaceFactory为非静态工厂在spring容器中定义的bean,生成实现对象的方法为getInstance
(3)实现自己的FactoryBean
实现自己的FactoryBean主要用于以下两中场景:
A:对象的实例化过于繁杂,通过XML配置太过繁琐。B:某些每三库不能直接注册到spring容器的时候。
FactoryBean是spring容器提供的可以扩展容器对象实例化逻辑的接口。源码如下:
public interface FactoryBean{
Object getObject()throws Exception;
Class getObjectType();
boolean isSingleton();
}
注:getObject()此方法返回该FactoryBean生产的对象实例,实现此方法时给出自己对象实例化的逻辑。
getObjectType()此方法方法返回getObject()方法返回实例的类型。如果预先无法确定,返回Null.
isSingleton()此方法返回的结果表明是否所生成对象以单例形式存在于容器中。
一个简单的例子:
public class NowDateFactoryBean implements FactoryBean{
public Object getObject()throws Exception{
return new Date();
}
public Class getObjectType(){
return Date.class;
}
private boolean isSingleton(){
return false;
}
}
配置中这样写:
<bean id="nowDateDisplayer" class="...NowDateDisplayer">
<property name="nowDate">
<ref bean="nowDateBean"/><!--此实现通过自定义的FactoryBean获得-->
</property>
</bean>
<bean id="nowDateBean" class="NowDateFactoryBean"/>