BeanFactory和FactoryBean区别

BeanFactory是Spring中提供的一个工厂,可以产生对象,最常用的API就是getBean(),可以通过be-anName或者Bean的类型(Class)得到一个Bean。FactoryBean则是一个Bean。

如果一个类实现了FactoryBean,那么Spring容器中存在两个对象,一个是getObject()返回的对象,还有一个是当前对象。

如果需要通过BeanFactory的getBean方法来获取FactoryBean本身,必须在beanName前面拼接上“&”,如果不拼接,实际获得的是getObject()方法所返回的对象。

什么时候使用FactoryBean?

当构造的对象依赖关系非常复杂的时候可以使用FactoryBean来构造它们。经典的应用场景例如My Batis的MapperFactoryBean。

代码示例

public class CustomizedFactoryBean implements FactoryBean<CustomizedFactoryBean.CreatedByFactoryBean> {

    @Override
    public CreatedByFactoryBean getObject() throws Exception {
        return new CreatedByFactoryBean();
    }

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

    class CreatedByFactoryBean{

    }

    public static void main(String[] args) {
        //
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
        context.register(CustomizedFactoryBean.class);
        context.refresh();
        CreatedByFactoryBean createdByFactoryBean = context.getBean("customizedFactoryBean",CreatedByFactoryBean.class);
        System.out.println("如果未拼接&,实际得到的FactoryBean实例的getObject方法所返回的Bean: " + createdByFactoryBean);
        CustomizedFactoryBean factoryBean = context.getBean("&customizedFactoryBean", CustomizedFactoryBean.class);
        System.out.println("如果拼接&,才能FactoryBean本身: " +factoryBean);
    }
}

运行结果:在这里插入图片描述

你可能感兴趣的:(Spring,Context,java,bean,spring,5,spring,boot,设计模式)