spring-FactoryBean

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"/>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值