BeanFactory和FactoryBean有什么本质区别?

摘要:要彻底分清 BeanFactory 和 FactoryBean,核心是抓住名称相似但定位完全不同:BeanFactory 是 IoC 容器的「顶层接口」,负责管理所有 Bean;FactoryBean 是创建复杂 Bean 的「工厂接口」,
要彻底分清 BeanFactory 和 FactoryBean,核心是抓住名称相似但定位完全不同:BeanFactory 是 IoC 容器的「顶层接口」,负责管理所有 Bean;FactoryBean 是创建复杂 Bean 的「工厂接口」,是单个 Bean 的「自定义创建工具」。 一、先看核心定位(一句话区分) 特性 BeanFactory FactoryBean 核心角色 IoC 容器(管理者) Bean 工厂(生产者) 作用范围 管理容器中所有 Bean 的生命周期 只负责创建某一个特定的 Bean 核心方法 getBean(String name)、containsBean() 等 getObject()(创建 Bean)、getObjectType()(返回 Bean 类型) 使用目的 定义容器的基本行为(获取/判断 Bean) 自定义 Bean 的创建逻辑(解决复杂 Bean 实例化问题) 二、详细拆解 1. BeanFactory:IoC 容器的「根接口」 BeanFactory 是 Spring IoC 容器的最底层核心接口,所有 Spring 容器(比如 ApplicationContext)都实现了这个接口,它定义了 IoC 容器的基础能力。 核心特点: 容器的本质:它不是一个具体的类,而是「容器规范」——规定了容器必须具备「获取 Bean、判断 Bean 是否存在、判断 Bean 作用域」等能力。 核心方法:public interface BeanFactory { // 根据名称获取Bean(核心方法) Object getBean(String name) throws BeansException; // 根据名称+类型获取Bean <T> T getBean(String name, Class<T> requiredType) throws BeansException; // 判断容器中是否包含该Bean boolean containsBean(String name); // 判断Bean是否是单例 boolean isSingleton(String name); } 常见实现类: DefaultListableBeanFactory:最基础的容器实现(ApplicationContext 底层依赖它); ApplicationContext:继承 BeanFactory,是增强版容器(非懒加载、支持事件/国际化等)。 简单示例(使用 BeanFactory): public class BeanFactoryDemo { public static void main(String[] args) { // 创建基础容器实例 DefaultListableBeanFactory factory = new DefaultListableBeanFactory(); // 注册一个简单的BeanDefinition(描述UserService) BeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition(UserService.class).getBeanDefinition(); factory.registerBeanDefinition("userService", beanDefinition); // 从容器获取Bean(BeanFactory的核心能力) UserService userService = (UserService) factory.getBean("userService"); userService.sayHello(); } } class UserService { public void sayHello() { System.out.println("Hello BeanFactory"); } } 2. FactoryBean:创建复杂 Bean 的「工厂接口」 FactoryBean 是 Spring 提供的自定义 Bean 创建逻辑的接口——当某个 Bean 的创建过程很复杂(比如需要多步初始化、依赖第三方资源),直接用 new 或注解无法满足时,就可以实现 FactoryBean 来定制创建逻辑。
阅读全文