FactoryBean的使用

一般情况下Spring通过bean中的class属性,通过反射创建Bean的实例。但在某些情况下,实例化Bean的过程比较复杂,如果按照传统的方式,则需要在bean标签中提供大量的配置信息,配置方式的灵活性是受限的,这时采用编码的方式可能会得到一个简单的方案。Spring为此提供了一个org.springframework.beans.factory.FactoryBean的接口。用户可以实例化该接口,实现定制化bean实例创建逻辑。

FactoryBean接口对应Spring框架来说占有重要的地位,Spring本身就提供了70多个FactoryBean的实现。他们隐藏了实例化一些复杂的细节,给上层应用带来了便利。从Spring3.0开始,FactoryBean开始支持泛型。

public interface FactoryBean<T> {
    // 返回factoryBean创建的实例,如果isSingleton为true,则该实例会放到Spring容器中
    // 单实例缓存池中
    T getObject() throws Exception;
    // 返回FactoryBean创建的bean的类型
    Class<?> getObjectType();
    // 返回FactoryBean创建的是作用域是singleton还是prototype。
    boolean isSingleton();
}

当配置文件的Bean标签的class属性配置的实现类是FactoryBean的,通过getBean方法返回的不是FactoryBean本身,而是FactoryBean#getObject方法所返回的对象,这就是工厂类(可以实现自定义类的创建过程)注入的原理。

这里也解释了,getBean为啥一开始要通过name获取BeanName的原因,因为beanName对应的可能是一个工厂类。当然还有一点,如果我不是想获取getObject方法,就是想获得FactoryBean的实例,那么这个时候就需要加上'&'符,这就是为什么在生成beanName时要去掉factory前缀的原因。

还有如果你使用自己自定的BeanFactory,那么你可以自己设置一些bean属性,举个例子:

public class MyBeanFactory implements BeanFactory {
    private String carInfo;
    // carInfo的get与set方法
        ····
}

那么xml可以这么定义。

<bean id="car" class="com.gavin.bean.Car" carInfo="5.6排量,红色">
</bean>

好了,关于Spring的BeanFactory的内容就是这些。

results matching ""

    No results matching ""