1. FactoryBean核心概念解析
Spring框架中有两个容易混淆的接口:BeanFactory和FactoryBean。虽然名称相似,但它们的职责完全不同。BeanFactory是Spring容器的根接口,负责管理和维护所有Bean实例;而FactoryBean是一种特殊的Bean,它本身是一个工厂,能够生产其他Bean实例。
1.1 基本定义与作用
FactoryBean是一个接口,定义在org.springframework.beans.factory包中。它的核心作用是为复杂对象的创建提供更灵活的方式。当我们需要在Spring容器中注册一个对象,但这个对象的创建过程比较复杂(比如需要特定初始化逻辑、依赖外部资源等),就可以考虑使用FactoryBean。
FactoryBean最常见的应用场景包括:
- 集成第三方库时创建复杂对象
- 需要根据条件动态决定返回哪种实现类
- 对象创建过程需要特殊处理(如连接池、代理对象等)
提示:FactoryBean特别适合封装那些创建过程复杂、需要特殊处理的Bean,让Spring容器能够以标准方式管理这些特殊对象。
1.2 与普通Bean的区别
普通Bean(如使用@Component注解的类)和FactoryBean有几个关键区别:
-
创建时机:普通Bean由Spring直接实例化;FactoryBean先由Spring实例化,然后调用其getObject()方法创建目标对象。
-
管理方式:Spring管理FactoryBean实例本身的生命周期,但不直接管理getObject()返回的对象(除非该对象也实现了Spring的生命周期接口)。
-
获取方式:
- 直接通过bean名称获取的是getObject()返回的对象
- 在bean名称前加"&"前缀获取的是FactoryBean实例本身
-
灵活性:FactoryBean可以在运行时动态决定返回的对象类型和数量,而普通Bean在编译时就已经确定了。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. FactoryBean接口详解
2.1 核心方法解析
FactoryBean接口定义了三个核心方法:
java复制public interface FactoryBean<T> {
// 返回由FactoryBean创建的对象实例
T getObject() throws Exception;
// 返回创建的对象的类型
Class<?> getObjectType();
// 指示getObject()返回的对象是否是单例
boolean isSingleton();
}
2.1.1 getObject()方法
这是FactoryBean的核心方法,负责实际创建和返回目标对象。这个方法有以下几个特点:
- 每次调用可能返回新实例或同一实例,取决于isSingleton()的返回值
- 可以抛出任何异常,Spring会将其包装为BeanCreationException
- 如果FactoryBean本身还未初始化完成就调用此方法,会抛出FactoryBeanNotInitializedException
2.1.2 getObjectType()方法
这个方法返回getObject()方法创建的对象的类型。这个信息在Spring的类型检查和自动装配时非常重要。
注意:如果FactoryBean尚未初始化(比如在循环依赖场景下),此方法应返回null,表示类型尚不确定。
2.1.3 isSingleton()方法
这个方法决定getObject()返回的对象是否是单例:
- 返回true:每次调用getObject()返回同一实例
- 返回false:每次调用getObject()返回新实例
2.2 生命周期与依赖注入
FactoryBean的生命周期有一些特殊之处:
- 初始化顺序:FactoryBean本身会先初始化,然
