1. FactoryBean的本质与设计哲学
在Spring框架的日常使用中,我们大多数时候都在和普通Bean打交道——那些通过@Component注解或XML配置声明后,由Spring容器自动实例化、管理的对象。但当你需要创建一些构造过程特别复杂的对象时,标准的Bean定义方式就会显得捉襟见肘。这正是FactoryBean存在的意义。
FactoryBean本质上是一个生产Bean的工厂,它自己也是一个Bean,但特殊之处在于Spring容器不会直接返回这个工厂实例,而是调用它的getObject()方法来获取它生产的"产品"。这种设计模式在Spring内部被广泛使用,比如当我们使用@Bean注解配置数据源时,实际上就是在使用FactoryBean的一种简化形式。
提示:FactoryBean的命名可能会让人产生误解——它并不是Spring工厂模式的基础接口,而是一个专门用于扩展Bean创建逻辑的SPI(Service Provider Interface)。真正的Spring Bean工厂是BeanFactory接口。
1.1 FactoryBean与普通Bean的核心差异
理解FactoryBean的关键在于把握它与普通Bean的几个本质区别:
-
实例化时机:
- 普通Bean在容器启动时就会完成实例化(单例情况下)
- FactoryBean本身会立即实例化,但它生产的对象只有在首次请求时才会创建
-
获取方式:
java复制// 获取普通Bean MyBean bean = context.getBean("myBean"); // 获取FactoryBean生产的产品 Product product = context.getBean("myFactoryBean"); // 获取FactoryBean本身需要添加'&'前缀 FactoryBean factory = (FactoryBean) context.getBean("&myFactoryBean"); -
生命周期控制:
- 普通Bean的生命周期由Spring全权管理
- FactoryBean可以完全控制其产品的创建、初始化和销毁过程
这种设计带来的最大优势是:将复杂对象的创建逻辑封装在FactoryBean内部,让使用方无需关心对象构建的细节,只需像使用普通Bean一样声明和获取即可。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. FactoryBean接口深度解析
FactoryBean接口定义非常简单,只包含三个方法,但每个方法都承担着重要职责:
java复制public interface FactoryBean<T> {
T getObject() throws Exception;
Class<?> getObjectType();
boolean isSingleton();
}
