Spring的工厂Bean是Spring的一种特殊Bean,这种工厂Bean必须实现FactoryBean接口。
FactoryBean接口是工厂Bean的标准接口,实现该接口的Bean通常只能作为工厂Bean使用。当我们将工厂Bean部署在容器中,并通过getBean()方法来获取工厂Bean时,容器不会返回FactoryBean实例,而是返回FactoryBean的产品。
FactoryBean接口提供如下三个方法:
接口 | 描述 |
T getObject() | 实现该方法负责返回该工厂Bean生成的Java实例 |
Class<?> getObjectType() | 实现该方法返回该工厂Bean生成的Java实例的实现类 |
boolean isSingleton() | 实现该方法表示该工厂Bean生成的Java实例是否为单例模式 |
实现FactoryBean接口的Bean无法作为正常Bean使用。配置FactoryBean与配置普通Bean的定义没有区别,但当客户端对该Bean id请求时,容器返回该FactoryBean的产品,而不是返回该FactoryBean本身。
当我们确实需要获取FactoryBean本身时,可以在Bean id前加&符号。
对于初学者而言,可能无法体会到工厂Bean的作用。实际上,FactoryBean是Spring中非常有用的一个接口。Spring内置提供了很多实用的工厂Bean,例如TransactionProxyFactoryBean,这个工厂Bean专门用于为目标Bean创建事务代理。
Spring提供的工厂Bean,大多用于生产一批具有某种特征的Bean实例,工厂Bean是Spring的一个重要工具类。