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的内容就是这些。