spring中BeanFactory和FactoryBean区别?

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. 核心区别

方面BeanFactoryFactoryBean
角色容器本身,管理所有 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 是应用级别的组件接口

作 者:南烛
链 接:https://www.itnotes.top/archives/1066
来 源:IT笔记
文章版权归作者所有,转载请注明出处!


上一篇
下一篇