spring-FactoryBean

spring FactoryBean
在面向接口编程时,当我们程序依赖第三方类库,需要实例化并使用第三类库中的相关类时,通常使用工厂方法模式,通过工厂类来来实例化具体的接口实现类,这时我们对象依赖
无法直接注入,FactoryBean即为解决此种性况而生。

(1)针对静态工厂方法类返回的实现

<bean id="yourbean" class ="">
    <property>
        
        <ref bean="interfaceImpl"/>
    property>
bean>

<bean id="interfaceImpl" class="...InterfaceFactory" factory-method="getInstance"/>

注:InterfaceFactory为第三方类库提供的生成其接口实现的静态工厂类,生成实现对象的方法为getInstance

(2)针对非静态工厂方法

<bean id="yourbean" class ="">
    <property>
        
        <ref bean="interfaceImpl"/>
    property>
bean>

<bean id="interfaceFactory" class="...InterfaceFactory"/>

<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"/>
    property>
bean>
<bean id="nowDateBean" class="NowDateFactoryBean"/>

你可能感兴趣的:(spring,学习,spring,factorybea)