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之前加上&。

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