閱讀692 返回首頁    go 京東網上商城


FactoryBean的使用

FactoryBean的使用

​ 一般情況下,Spring通過反射機製利用Bean的class來實例化Bean,但有的情況下實例化Bean過程比較複雜,如果使用需要大量配置,或者使用@Bean在注釋方法中需要寫大量代碼。Spring為此給我們提供了一個org.springframework.bean.factory.FactoryBean<T>的工程類接口,用戶可以實現該接口用於實例化一個類的邏輯。

public interface FactoryBean<T> {
    boolean isSingleton(); //由FactoryBean創建的bean是 singleton還是prototype

    Class<?> getObjectType(); //獲取FactoryBean創建的bean類型

    T getObject() throws Exception; //返回FactoryBean創建的bean實例,如果isSingleton()返回為true,則該實例會被放到Spring單例緩衝池中
}

注意:

​ 當我們注冊一個FactoryBean類型到Spring容器中後,再去獲取FactoryBean對應bean時,返回的類型不是FactoryBean,而是FactoryBean創建的對象,如果要獲取FactoryBean本身,那要加上前綴&.

class Dog{
    public String name = "dog";
}

//實現FactoryBean接口,用於創建Dog的bean
class DogFactoryBean implements FactoryBean<Dog>{
    @Override
    public Dog getObject() throws Exception {
        return new Dog();
    }
    @Override
    public Class<?> getObjectType() {
        return Dog.class;
    }
    @Override
    public boolean isSingleton() {
        return true;
    }
}

public class SpringDemo {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext applicationContext 
          = new AnnotationConfigApplicationContext();
        applicationContext.register(DogFactoryBean.class); //注冊一個FactoryBean類型
        applicationContext.refresh();

        //獲取剛剛注冊的DogFactoryBean,實際返回的是DogFactoryBean創建的Dog
        Object dog = applicationContext.getBean("dogFactoryBean");
        System.out.println(dog);// 打印結果com.example.Dog@480bdb19

        //加上&就可以獲取剛剛注冊的DogFactoryBean
        Object dogFactoryBean = applicationContext.getBean("&dogFactoryBean");
        System.out.println(dogFactoryBean);// 打印結果com.example.DogFactoryBean@2a556333
    }
}

最後更新:2017-04-11 17:31:02

  上一篇:go 論文導讀:對抗樣本與學習
  下一篇:go 盤點2017年大數據、雲計算產業將要舉辦的大會