factorybean用于自定义复杂bean的实例化过程,适用于代理对象、第三方客户端等场景;其getobject()返回真实bean,getobjecttype()声明类型,issingleton()控制单例性。

在 Spring 中,FactoryBean 是一个专门用于**自定义复杂 Bean 实例化过程**的接口,适合处理那些无法通过简单构造或 @Bean 方法直接创建的对象(比如代理对象、第三方 SDK 客户端、带初始化逻辑的连接池等)。
为什么不用 @Bean?什么时候选 FactoryBean?
@Bean 方法返回的是最终要注入容器的 Bean 实例;而 FactoryBean 的核心价值在于:它本身是一个工厂,Spring 会调用它的 getObject() 获取真实 Bean,同时还能控制该 Bean 的类型(getObjectType())、是否单例(isSingleton()),甚至参与 AOP 代理决策。
典型适用场景包括:
- 需要在 Bean 创建后执行不可跳过的初始化(如连接建立、配置校验)
- 返回的对象类型和工厂类类型不一致(例如
MyClientFactoryBean返回HttpClient) - 需按条件动态决定返回代理还是原始对象(如熔断客户端)
- 封装重复的构建模板(如统一添加拦截器、设置超时)
实现 FactoryBean 的三个关键方法
只需实现 org.springframework.beans.factory.FactoryBean<t></t> 接口,并指定泛型为你要生产的 Bean 类型:
-
getObject():真正创建并返回 Bean 实例。可包含任意复杂逻辑,比如读配置、建连接、设回调、抛异常阻断启动 -
getObjectType():返回getObject()的实际运行时类型(不是工厂类类型)。Spring 依赖此信息做类型匹配和自动注入 -
isSingleton():决定该 Bean 是否以单例形式存入 IoC 容器。多数情况下返回true;若每次都要新实例(如非线程安全的上下文对象),返回false
注意:getObject() 抛出的异常会被 Spring 捕获并包装为 BeanCreationException,因此可在其中做强校验(如配置缺失直接失败)。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
注册与使用:像普通 Bean 一样,但加 & 前缀取工厂本身
将自定义 FactoryBean 作为 @Bean 注册即可:
@Bean
public MyDatabaseClientFactoryBean databaseClient() {
MyDatabaseClientFactoryBean factory = new MyDatabaseClientFactoryBean();
factory.setUrl("jdbc:h2:mem:test");
factory.setUsername("sa");
return factory;
}
注入时,直接按目标类型(如 DatabaseClient)注入,Spring 自动调用 getObject():
@Autowired private DatabaseClient client; // 注入的是 getObject() 返回的对象
如果想获取工厂本身(比如调用其自定义方法或检查状态),需在 bean 名前加 &:
@Autowired
@Qualifier("&databaseClient") // 注意 & 符号
private FactoryBean<databaseclient> factory;</databaseclient>
进阶技巧:结合 InitializingBean / DisposableBean 或 Lifecycle
FactoryBean 本身不直接支持生命周期回调,但可以在 getObject() 内部手动触发:
- 让创建出的对象实现
InitializingBean或声明@PostConstruct,并在getObject()中显式调用afterPropertiesSet() - 若需销毁逻辑(如关闭连接),让对象实现
DisposableBean,再在工厂类中重写destroy()方法(FactoryBean接口可选实现该方法) - 更现代的方式是让工厂类实现
SmartFactoryBean,它扩展了isPrototype()和isEagerInit()等能力,便于精细控制
不复杂但容易忽略:Spring 在预实例化单例时,会对 FactoryBean 调用 getObject() 一次;如果该方法耗时或有副作用,建议内部加同步或缓存,避免重复初始化。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










