Spring 通过反射机制利用<bean>的class属性指定实现类实例化Bean. 在某些情况下, 实例化Bean的过程比较复杂, 如果按照传统方式, 需要在<bean>中提供大量的配置信息. 配置方式的灵活性受限. 这时采用编码可能会获得一个简单的方式.
Spring 提供了一个 org.springframework.beans.factory.FactoryBean 工厂类接口. 用户可以通过实现该工厂类接口定制实例化Bean的逻辑. Spring提供了70多个FactoryBean的实现类, 它们隐藏了一些复杂实例化Bean的细节, 给上层应用带来了便利.
T getObject()返回由FactoryBean创建的Bean实例. 如果 isSingleton()返回 true, 则该实例会放到 Spring 容器的单实例缓存池中.
Class<?> getObjectType() 返回FactoryBean创建Bean的类型.
当配置文件中<bean>的class属性配置的实现类是 FactoryBean时, 通过getBean()方法返回的不是 FactoryBean本身, 而是 FactoryBean#getObject()方法所返回的对象. 相当于 FactoryBean#getObject() 代理了 getBean()方法.
示例代码如下:
CatFactoryBean实现了 FactoryBean接口, 自定义了对象的实现.
配置文件:
测试代码:
当调用 getBean("cat") 方法时, Spring通过反射机制发现 CatFactoryBean 实现了 FactoryBean的接口. 这时Spring容器调用接口方法 CarFactoryBean#getObject() 返回工厂类创建的对象.