BeanFactory 和 FactoryBean 是 Spring 中两个完全不同的概念,虽然名称相似但功能不同:
1. BeanFactory
核心概念
- Spring IoC 容器的根接口,是 Spring 容器的基础
- 实现了工厂模式,用于创建和管理 Bean
- 是所有 Spring 容器的顶层接口
主要功能
// BeanFactory 接口定义的核心方法
public interface BeanFactory {
Object getBean(String name) throws BeansException;
<T> T getBean(String name, Class<T> requiredType) throws BeansException;
boolean containsBean(String name);
boolean isSingleton(String name) throws BeansException;
// ...
}
特点
- 延迟加载:默认情况下,Bean 在使用时才实例化
- 轻量级容器:相对于 ApplicationContext
- 提供了完整的 IoC 服务支持
2. FactoryBean
核心概念
- 一个特殊的 Bean 接口
- 用于创建复杂对象的工厂
- 本身也是一个 Bean,但能生产其他 Bean 实例
主要功能
// FactoryBean 接口定义
public interface FactoryBean<T> {
T getObject() throws Exception; // 返回生产的对象
Class<?> getObjectType(); // 返回对象类型
boolean isSingleton(); // 是否单例
}
特点
- 工厂模式的实现:隐藏复杂对象的创建逻辑
- 灵活的 Bean 创建:可以自定义实例化过程
- 代理模式常用:常用于创建代理对象
3. 核心区别
| 方面 | BeanFactory | FactoryBean |
|---|---|---|
| 角色 | 容器本身,管理所有 Bean | 特殊 Bean,能创建其他 Bean |
| 接口类型 | 容器接口 | Bean 接口 |
| 数量 | 一个容器只有一个 BeanFactory | 可以有多个不同的 FactoryBean |
| 功能 | 管理 Bean 的生命周期 | 定制 Bean 的创建过程 |
| 使用场景 | 作为容器使用 | 创建复杂对象、代理对象 |
4. 使用示例
FactoryBean 示例
// 1. 定义 FactoryBean
public class CarFactoryBean implements FactoryBean<Car> {
private String brand;
@Override
public Car getObject() throws Exception {
// 复杂的创建逻辑
Car car = new Car();
car.setBrand(this.brand);
car.setCreateTime(new Date());
return car;
}
@Override
public Class<?> getObjectType() {
return Car.class;
}
@Override
public boolean isSingleton() {
return true;
}
// getter/setter...
}
// 2. 配置
@Bean
public CarFactoryBean carFactory() {
CarFactoryBean factory = new CarFactoryBean();
factory.setBrand("BMW");
return factory;
}
// 3. 使用
@Autowired
private Car car; // 实际获取的是 getObject() 返回的 Car 对象
// 获取 FactoryBean 本身
CarFactoryBean factory = context.getBean("&carFactory");
5. 使用注意事项
FactoryBean 特殊语法
// 获取 FactoryBean 生产的对象
Object car = context.getBean("carFactory");
// 获取 FactoryBean 本身(加 & 前缀)
FactoryBean factory = context.getBean("&carFactory");
常见使用场景
- FactoryBean:创建 MyBatis 的 SqlSessionFactory、复杂的数据源、AOP 代理等
- BeanFactory:很少直接使用,通常用其子接口 ApplicationContext
总结
- BeanFactory 是容器,负责管理所有 Bean
- FactoryBean 是特殊的 Bean,负责创建特定的复杂对象
- 两者是完全不同的层次:BeanFactory 是框架级别的容器接口,FactoryBean 是应用级别的组件接口