问题:
1、某一对象A依赖于接口B, 当使用spring为对象A注入接口B的实现类时, 接口B的实现类可能不确定,对于这种情况我们怎么处理?
2、某一对象A依赖于接口B, 但是接口B的实现类, 依赖于第三方库, 第三方库需要初始化、处理相关的类, 这种情况我们怎么处理?
针对上面的情况, 我们可以自己创建一个工厂, 让工厂创建所需要的实现类, 然后注入到对象A中
方法一:静态工厂方法
//静态工厂类
public class StaticFactory {
//静态工厂方法
public static Bean3 getBean3Instance(String param){
System.out.println(param);
return new Bean3Impl();
}
}
//XML文件配置
<bean id="bean3" class="com.spring.bean.StaticFactory" factory-method="getBean3Instance">
<!-- 传入工厂方法的参数-->
<constructor-arg><value>paramvalue</value></constructor-arg>
</bean>
//需要注入bean3的地方
<bean name="bean" class="com.spring.bean.BeanImpl">
<property name="bean3" ref="bean3" />
</bean>
方法二:实例工厂方法
public class NoStaticFactory {
public Bean3 getBean3Instance() {
return new Bean3Impl();
}
}
<bean id="noStaticFactory" class="com.spring.bean.NoStaticFactory">
</bean>
<bean id="bean3" factory-bean="noStaticFactory" factory-method="getBean3Instance"/>
方法三:继承spring提供的FactoryBean, 实现getObject方法
public class Bean3FactoryBean implements FactoryBean{
@Override
public Object getObject() throws Exception {
return new Bean3Impl();
}
@Override
public Class getObjectType() {
return null; //To change body of implemented methods use File | Settings | File Templates.
}
@Override
public boolean isSingleton() {
return false; //To change body of implemented methods use File | Settings | File Templates.
}
}
<bean id="bean3" class="com.spring.bean.Bean3FactoryBean" />
factory.getBean("bean3")是获取Bean3接口的实现类,
factory.getBean("&bean3")获取Bean3FactoryBean 工厂实例