02、使用FactoryBean接口添加Bean

FactoryBean接口有三個方法可以重寫:

  • getObject()返回對象方法;

  • getObjectType返回對象類型

  • isSingleton()是否單例控制

1. 新建Pig類

public class Pig {
}

2. MyFactoryBean實現FactoryBean

//創建一個Spring定義的工廠bean
public class MyFactoryBean implements FactoryBean<Pig> {
    //返回一個Pig對象,這個對象會添加到容器當中
    @Override
    public Pig getObject() throws Exception {
        return new Pig();
    }

    @Override
    public Class<?> getObjectType() {
        return Pig.class;
    }

    //是否爲單例
    @Override
    public boolean isSingleton() {
        return true;
    }
}

3. 配置類

@Configuration
public class Cap7MainConfig {
    @Bean
    public MyFactoryBean myFactoryBean() {
        return new MyFactoryBean();
    }
}

4. 測試類

public class Cap7Test {

    @Test
    public void test() {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Cap7MainConfig.class);
        Object myFactoryBean = context.getBean("myFactoryBean");
        Object myFactoryBean2 = context.getBean("myFactoryBean");
        String className = myFactoryBean.getClass().getName();
        //打印myFactoryBean返回對象的實際類名
        System.out.println(className);
        //判斷myFactoryBean返回的兩個對象是否爲同一個。判斷是否爲單例
        System.out.println(myFactoryBean == myFactoryBean2);
        String[] names = context.getBeanDefinitionNames();
        for(String name : names) {
            System.out.println(name);
        }
    }
}

結果:
在這裏插入圖片描述

Pig對象已經成功添加到容器當中,並且兩次獲取的對象地址都一樣,證明是同一個對象。下面將isSingleton 的返回值改爲false,將MyFactoryBean返回的對象改爲多例的

結果:
在這裏插入圖片描述

證明isSingleton 返回的結果生效。

5. BeanFactory和FactoryBean的區別

  • BeanFactory

    BeanFactory是IOC最基本的容器,負責生產和管理bean,它爲其他具體的IOC容器提供了最基本的規範,例如DefaultListableBeanFactory,XmlBeanFactory,ApplicationContext 等具體的容器都是實現了BeanFactory,再在其基礎之上附加了其他的功能。

  • FactoryBean

    FactoryBean是一個接口,當在IOC容器中的Bean實現了FactoryBean後,通過getBean(String BeanName)獲取到的Bean對象並不是FactoryBean的實現類對象,而是這個實現類中的getObject()方法返回的對象。要想獲取FactoryBean的實現類,就要getBean(&BeanName),在BeanName之前加上&。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章