3.3 实例工厂方法
使用该方式实例化会从容器中调用现有bean的非静态方法来创建新bean。要使用此机制,需将class属性置空,并在factory-bean属性中,在当前(或父/祖先)容器中指定包含要创建该对象的实例方法的bean的名称。factory-method设置工厂方法本身的名称。
示例如下,来看看如何配置这样的bean:
相应的类:
一个工厂类也可以容纳一个以上的工厂方法,如下:
这种方式还表明,即使是工厂bean也可以通过依赖注入进行管理和配置。
“factory bean”是指在Spring容器中配置并通过实例或静态工厂方法创建对象的bean。相比之下,FactoryBean
是指特定于Spring的FactoryBean实现类。
4 如何确定Bean的运行时类型?
bean元数据定义中的指定类只是初始类引用,可能结合使用的如下方式之一:
- 声明的工厂方法
- FactoryBean类,该情况可能导致bean的运行时类型不同
实例级工厂方法(通过指定的factory-bean名称解析),该情况下直接就不设置了
因此,看起来确定bean运行时类型绝非易事,该如何准确获取呢?
BeanFactory.getType
推荐调用 BeanFactory.getType
确定bean的运行时类型。
该方法可确定给定名称bean的类型。 更确切地,返回针对相同bean名称的BeanFactory.getBean调用将返回的对象的类型。
且该方法的实现考虑了前面穷举的所有情况,并针对于FactoryBean ,返回FactoryBean所创建的对象类型,和FactoryBean.getObjectType()返回一致。