在spring中,如果类是由我们自己设计并开发的,那么可以通过依赖注入,让容器帮助我们解除接
口与实现类之间的耦合性。但是,如果在开发中我们需要使用第三方类库,并实例化中其中的相关类,我们就需要使用其他的方式避免接口与实现类的耦合性。
工厂Bean与工厂方法
一般情况下,应用程序有自己的工厂对象来创建bean.如果将应用程序自己的工厂对象交给Spring管理,那么Spring管理的就不是普通的bean,而是工厂Bean。
假设某个第三方库发布了 Ieat ,为了向使用该接口的客户端对象屏蔽以后可能对Ieat 实现类的变动,同时还提供了一个工厂方法实现类 EatFactory 。现在我们想在自己的应用中使用它, 代码如下:
public class EatFactory {
public Ieat getInstance() {
return new EatOrange();
}
}
这是我们的应用
public class Person {
Ieat eat;
public String eat(){
return eat.eat();
}
public Ieat getEat() {
return eat;
}
public void setEat(Ieat eat) {
this.eat = eat;
}
}
配置文件
<bean id="person " class="it.spring.liao.com.Person">
<property name="eat">
<ref bean="eatOrange"/>
</property>
</bean>
<bean id="eatFactory " class="it.spring.liao.com.EatFactory "/>
<bean id="eat" factory-bean="eatFactory " factory-method="getInstance"/>
工厂Bean与静态工厂方法
假如工厂类为我们提供了静态的工厂方法,那我们的配置文件就要稍加修改
静态的工厂方法
public class EatFactory {
public static Ieat getInstance() {
return new EatOrange();
}
}
配置文件
<bean id="person " class="it.spring.liao.com.Person">
<property name="eat">
<ref bean="eatOrange"/>
</property>
</bean>
<bean id="eatFactory " class="it.spring.liao.com.EatFactory" factory-method="getInstance" />
有一些工厂方法带有一些参数,现在假设我们实例化Ieat需要一个参数name,这时我们可以采用如下方法进行配置
public class EatFactory {
public static Ieat getInstance(String name) {
return new EatOrange(name);
}
}
<bean id="eatFactory " class="it.spring.liao.com.EatFactory" factory-method="getInstance" >
<constructor-arg>
<value>This is name</value>
</constructor-arg>
</bean>