1. 程式人生 > >一分鐘瞭解spring之FactoryBean

一分鐘瞭解spring之FactoryBean

轉自 http://blog.51cto.com/4247649/2118353

今天主要從以下兩方面來介紹一下FactoryBean

  • FactoryBean是什麼
  • FactoryBean使用演示

1,FactoryBean是什麼

  • FactoryBean從名字來看以bean結尾那應該就是一個bean吧,沒錯它確實是一個bean,不同於普通Bean的是:它是實現了FactoryBean介面的Bean,根據該Bean的ID從BeanFactory中獲取的實際上是FactoryBean的getObject()返回的物件,而不是FactoryBean本身,如果要獲取FactoryBean物件,請在id前面加一個&符號來獲取

2,FactoryBean使用演示
首先咱們一起來看下FactoryBean的原始碼如下:

public interface FactoryBean<T> {
    /**
     * 獲取bean對應的例項物件
     * @return
     * @throws Exception
     */
    T getObject() throws Exception;
    /**
     * 獲取factoryBean獲取到的例項型別
     * @return
     */
    Class<?> getObjectType();
    /**
     * factoryBean建立的例項是否是單例項
     * @return
     */
    boolean isSingleton();
}

可以發現FactoryBean是一個介面主要有3個方法,每個方法的意思程式碼中都有註釋這個就不重複了
下面我們通過FactoryBean來建立一個圖形Circular的bean,程式碼如下:

/**
 * 建立一個自定義的spring的FactoryBean
 *
 * @author zhangqh
 * @date 2018年5月2日
 */
public class MyFactoryBean implements FactoryBean<Circular>{
    public Circular getObject() throws Exception {
        return new Circular();
    }
    public Class<?> getObjectType() {
        return Circular.class;
    }
    /**
     * 是否是單例項的,可以通過改變返回值測試效果
     */
    public boolean isSingleton() {
        return true;
    }
}

再在MainConfig主配置中增加一個bean如下:

@Bean
public MyFactoryBean getMyFactoryBean(){
    return new MyFactoryBean();
}

測試程式碼如下:

AnnotationConfigApplicationContext applicationContext2 = new AnnotationConfigApplicationContext(MainConfig.class);
Object object = applicationContext2.getBean("getMyFactoryBean");
System.out.println("例項bean為 === "+object);
Object object2 = applicationContext2.getBean("&getMyFactoryBean");
System.out.println("例項bean為 === "+object2);

執行結果如下:

例項bean為 === [email protected]
例項bean為 === [email protected]

怎麼樣注意上面測試的列印結果,是不是跟我們開頭說的那樣根據該Bean的ID從BeanFactory中獲取的實際上是FactoryBean的getObject()返回的物件,而不是FactoryBean本身,如果要獲取FactoryBean物件,請在id前面加一個&符號來獲取