Spring - BeanFactory 之 FactoryBean

FactoryBean


简介

Spring中有两种类型的Bean,一种是普通Bean,另一种是工厂Bean,即FactoryBean。工厂Bean跟普通Bean不同,其返回的对象不是指定类的一个实例,其返回的是该工厂Bean的getObject方法所返回的对象。

BeanFactory和FactoryBean

很多人可能会因为这两者的名字而混淆,但实际上这两者的名字是十分清晰的。

FactoryBean是Spring容器里面一种特殊的Bean, 它是一个工厂Bean,Spring调用getBean方法获取到FactoryBean的时候会调用它的getObject把返回Object作为返回结果,而不是直接返回FactoryBean。

Factory是一个管理Bean的Factory,是spring IOC容器的核心,里面管理了所有的Bean,当然包括配置的FactoryBean。

例子

Product.class和ProductFactoryBean

public class Product {}

public class ProductFactoryBean implements FactoryBean {
    @Override
    public Object getObject() throws Exception {
        return new Product();
    }

    @Override
    public Class getObjectType() {
        return Product.class;
    }
}

ProductFactoryBean要实现FactoryBean这个接口。

配置:


测试代码:

ClassPathXmlApplicationContext appContext =
        new ClassPathXmlApplicationContext("classpath:app-context.xml");
System.out.println(appContext.getBean("product"));

结果: appcontext.factorybean.Product@134593bf

可以看到打印的结果是Product而不是ProductFactoryBean。

获取FactoryBean本身

FactoryBean本身也是一个Bean,如果我们不想获取FactoryBean生产的实例,而是获取它本身,我们可以通过 '&' + beanName 来获取FactoryBean本身。

测试代码:

ClassPathXmlApplicationContext appContext =
       new ClassPathXmlApplicationContext("classpath:app-context.xml");
System.out.println(appContext.getBean("&product"));

结果: appcontext.factorybean.ProductFactoryBean@134593bf

为什么要有FactoryBean?

使用FactoryBean更加灵活,因为创建Bean的流程完全由我们自己控制。

你可能感兴趣的:(Spring - BeanFactory 之 FactoryBean)