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的實例化對象。代理

相關文章
相關標籤/搜索