FactoryBean接口分析和使用
一下内容大都来自《spring源码深度解析》一书,感兴趣的可以买书支持一下作者!
1 概述
1 FactoryBean存在的意义:
某些时候,spring实例化bean的过程可能会比较复杂,而此时若直接使用spring反射机制实例化bean,则需要在bean中提供大量的配置信息,导致配置灵活性受限。采用编码方式可以解决这个问题,故而spring提供了一个FactoryBean的工厂类接口。
2 简述
FactoryBean对于spring来说占有重要的地位,spring自身就提供了70多种FactoryBean的实现。它们隐藏了实例化bean时的复杂细节,为上层的应用带来了便利。且spring的FactoryBean支持泛型。
2 接口分析
FactoryBean的接口源码如下所示:
public interface FactoryBean<T> {
T getObject() throws Exception;
Class<?> getObjectType();
boolean isSingleton();
}
三个方法的作用分别为:
1 T getObject() throws Exception;
返回由FactoryBean创建的bean实例,如果isSingleton为true,则该实例会被放进spring容器中单实例缓存池中;
2 Class<?> getObjectType();
返回FactoryBean创建的bean的类型;
3 boolean isSingleton();
判断由FactoryBean创建的bean实例是singleton还是prototype;
3 使用
当直接调用getBean方法,方法的参数为一个FactoryBean实现类时,返回的不是这个FactoryBean本身,而是FactoryBean#getObject()方法所返回的对象。
当然,若想要获得实现了FactoryBean的类本身,spring也提供了方法。即在调用getBean方法时,在该类对应的beanName前加"&",例如getBean("&customClass");