Spring的FactoryBean

首先咱们要知道Spring就是一个大的Bean容器池,用户经过简单的配置,让Spring帮忙实例化对象,而Spring是经过反射原理建立Bean的。java

而后咱们知道通常状况下咱们配置Bean时使用的是类的全路径。Spring还提供了另一种方法,经过FactoryBean的方式配置Bean。下面详细讲解FactoryBean。spring

(1)FactoryBean是Spring的一个接口,定义了如下3个接口方法:缓存

    Object getObject():返回有FactoryBean建立的Bean实例,若是isSingleton()返回true,则该实例会放到Spring容器的单实例缓存池中。
    boolean isSingleton():肯定由FactoryBean建立Bean的做用域是singleton仍是prototype。
    Class getObjectType():返回FactoryBean建立Bean的类型。ide

(2)当配置文件中 <bean>的class属性配置的实现类是FactoryBean时,经过getBean方法返回的不是FactoryBean自己,而是 FactoryBean#getObject()方法所返回的对象,至关于FactoryBean#getObject()代理了getBean()方法。this

(3)举一个简单的例子,好比当咱们建立某个bean时,须要作一些特殊的事情。代码以下:prototype

import org.springframework.beans.factory.FactoryBean;

public class MyFactoryBean implements FactoryBean {

    private MyBean instance;

    private String myFactoryBeanAttr;

    public String getMyFactoryBeanAttr() {
        return myFactoryBeanAttr;
    }

    public void setMyFactoryBeanAttr(String myFactoryBeanAttr) {
        this.myFactoryBeanAttr = myFactoryBeanAttr;
    }

    @Override
    public Object getObject() throws Exception {
        if (instance == null) {
            instance = createInstance();
        }
        return instance;
    }

    public Class getObjectType() {
        return MyBean.class;
    }

    protected MyBean createInstance() throws Exception {
        // do something
        return new MyBean();
    }

    public boolean isSingleton() {
        return true;
    }

    private static final class MyBean {
    }
}

这样当咱们在Spring中注册MyBeanFactory时实际生成的是MyBean的实例化对象。代理

相关文章
相关标签/搜索