Spring开发程序员SpringFramework

Spring的factory-method和factory-be

2017-03-16  本文已影响3952人  我叫了了

在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>
上一篇下一篇

猜你喜欢

热点阅读