在 Spring 框架中,BeanFactory
和 FactoryBean
是两个容易混淆但完全不同的概念。以下是它们的核心区别和用途解析:
1. BeanFactory
定义
- 核心接口:
BeanFactory
是 Spring IoC 容器的根接口,负责管理 Bean 的生命周期和依赖注入。 - 功能:提供最基础的 Bean 管理能力,例如:
- 通过
getBean()
获取 Bean 实例。 - 注册 Bean 定义(通过子类实现,如
DefaultListableBeanFactory
)。 - 解析依赖关系(自动装配)。
- 通过
特点
- 容器角色:是 Spring 容器的基础设施,直接与容器交互。
- 默认行为:默认情况下,
getBean("beanName")
返回的是容器中注册的 Bean 实例。 - 典型实现:
DefaultListableBeanFactory
、XmlBeanFactory
(已过时)等。
示例代码
java
复制
// 通过 BeanFactory 获取 Bean
BeanFactory factory = new DefaultListableBeanFactory();
((DefaultListableBeanFactory) factory).registerSingleton("myBean", new MyBean());
MyBean bean = (MyBean) factory.getBean("myBean");
2. FactoryBean
定义
- 特殊 Bean:
FactoryBean
是一个标记接口(org.springframework.beans.factory.FactoryBean
),用于创建复杂对象或需要定制化逻辑的 Bean。 - 功能:实现
FactoryBean
的 Bean 本身是一个工厂,其getObject()
方法返回实际需要的对象。
特点
- 间接创建:当配置一个
FactoryBean
时,Spring 容器会调用其getObject()
方法获取真正的 Bean 实例。 - 透明性:通过
getBean("factoryBeanName")
获取的是getObject()
的返回值,而非FactoryBean
实例。若要获取FactoryBean
本身,需使用&
前缀(如getBean("&factoryBeanName")
)。 - 典型场景:动态生成 Bean、封装复杂初始化逻辑(如数据库连接池)。
示例代码
java
复制
// 定义 FactoryBean
public class MyConnectionFactory implements FactoryBean<Connection> {
@Override
public Connection getObject() throws Exception {
// 创建并返回数据库连接
return DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb");
}
@Override
public Class<?> getObjectType() {
return Connection.class;
}
@Override
public boolean isSingleton() {
return true; // 是否为单例
}
}
// 配置到 Spring 容器
@Configuration
public class AppConfig {
@Bean
public FactoryBean<Connection> connectionFactory() {
return new MyConnectionFactory();
}
}
// 使用
@Autowired
private Connection connection; // 实际注入的是 getObject() 返回的 Connection
3. 核心区别
特性 | BeanFactory | FactoryBean |
---|---|---|
角色 | 容器接口,管理所有 Bean | 特殊 Bean,作为工厂生产其他 Bean |
用途 | 容器基础设施,直接操作 Bean | 封装复杂对象的创建逻辑 |
访问方式 | 直接通过容器方法操作 | 通过 getBean() 获取其生产的对象 |
返回值 | 返回容器中注册的 Bean | 返回 getObject() 的结果 |
典型场景 | 容器初始化、Bean 定义注册 | 动态生成对象、第三方库封装 |
4. 总结
- BeanFactory 是 Spring 容器的核心接口,负责管理所有 Bean。
- FactoryBean 是一种特殊的 Bean,用于简化复杂对象的创建过程,隐藏初始化细节。
- 关键区别:
BeanFactory
是容器,而FactoryBean
是工厂 Bean,最终通过它生产其他 Bean。
一句话区分:
BeanFactory
是“大管家”(管理所有 Bean),FactoryBean
是“流水线工人”(专门生产特定 Bean)。