当前位置: 首页 > news >正文

BeanFactory和FactoryBean区别

要彻底分清 BeanFactoryFactoryBean,核心是抓住名称相似但定位完全不同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;// 判断容器中是否包含该Beanboolean 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 来定制创建逻辑。

核心特点:
  • 针对单个 Bean:一个 FactoryBean 只负责创建一种类型的 Bean;
  • 核心方法
    public interface FactoryBean<T> {// 核心:创建并返回自定义的Bean实例T getObject() throws Exception;// 返回创建的Bean的类型Class<?> getObjectType();// 是否单例(默认true)default boolean isSingleton() {return true;}
    }
    
  • 特殊获取规则
    • 调用 context.getBean("factoryBeanName"):返回 getObject() 创建的目标 Bean
    • 调用 context.getBean("&factoryBeanName"):返回 FactoryBean 本身(加 & 是区分标识)。
典型应用场景:

MyBatis 整合 Spring 时的 MapperFactoryBean、Redis 客户端 RedisTemplate 的创建、数据库连接池 DataSource 的创建等,都是基于 FactoryBean 实现的(因为这些 Bean 的创建需要加载配置、初始化连接等复杂逻辑)。

简单示例(自定义 FactoryBean):
// 1. 定义一个复杂Bean(需要定制创建逻辑)
class User {private String name;private int age;// 构造器+getter/setterpublic User(String name, int age) {this.name = name;this.age = age;}public void say() {System.out.println("姓名:" + name + ",年龄:" + age);}
}// 2. 实现FactoryBean自定义创建逻辑
@Component("userFactoryBean")
class UserFactoryBean implements FactoryBean<User> {@Overridepublic User getObject() throws Exception {// 模拟复杂创建逻辑:加载配置、初始化参数等String name = "张三";int age = 25;return new User(name, age); // 自定义创建User实例}@Overridepublic Class<?> getObjectType() {return User.class; // 返回创建的Bean类型}
}// 3. 测试获取Bean
public class FactoryBeanDemo {public static void main(String[] args) {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext("com.example");// 获取FactoryBean创建的目标Bean(User)User user = context.getBean("userFactoryBean", User.class);user.say(); // 输出:姓名:张三,年龄:25// 获取FactoryBean本身(加&前缀)UserFactoryBean factoryBean = context.getBean("&userFactoryBean", UserFactoryBean.class);System.out.println(factoryBean.getObjectType()); // 输出:class com.example.Usercontext.close();}
}

三、核心区别总结(对比表)

维度 BeanFactory FactoryBean
本质 IoC 容器的「接口规范」 创建单个 Bean 的「工厂接口」
关注点 容器如何管理所有 Bean 如何创建某一个特定的 Bean
使用方式 作为容器使用(getBean() 获取 Bean) 实现该接口,重写 getObject() 定制创建逻辑
依赖关系 所有 Spring 容器都实现此接口 本身是一个 Bean,由 BeanFactory 管理
典型实现 ApplicationContextDefaultListableBeanFactory MapperFactoryBeanRedisTemplateFactoryBean

四、容易混淆的点

  1. 名称陷阱:不要被「Factory」和「Bean」的顺序误导——BeanFactory 是「Bean 的工厂(容器)」,FactoryBean 是「工厂(本身是 Bean)」;
  2. 管理关系FactoryBean 本身也是一个 Bean,它的生命周期由 BeanFactory 管理;BeanFactory 调用 FactoryBeangetObject() 方法来创建目标 Bean。

总结

  1. BeanFactory 是 Spring IoC 容器的「根接口」,定义了容器管理 Bean 的核心能力(获取、判断 Bean),是所有容器的基础;
  2. FactoryBean 是自定义 Bean 创建逻辑的「工具接口」,用于解决复杂 Bean 的实例化问题,本身是一个被容器管理的 Bean;
  3. 记忆技巧:BeanFactory 是「大管家」(管所有 Bean),FactoryBean 是「专属工匠」(只造某一个 Bean)。
http://www.jsqmd.com/news/461601/

相关文章:

  • DP遍历避坑:索引遍历 vs 长度遍历,该怎么选?
  • 玩泥巴的|mudtools.cn
  • 网站视频下载工具VideoDownloadStudio
  • 分析2026年好用的双碳数字化源头厂家,大连地区哪家口碑好 - 工业品网
  • 初学者必读:快门速度的奥妙与应用指南
  • 抄书 2901️⃣天
  • 先扔个效果图镇楼。板子上电后打开串口助手,发送“0x55“直接回显,实测115200波特率下收发稳定。下面咱们掰开揉碎说代码实现
  • 记录 | 个人开发库推送至PyPi流程梳理(ChatGPT to Markdown 工具发布完整流程)
  • 软考高项通关实测:拒绝论文套路,3个月从焦虑到持证的真实备考经验
  • 2026年剖析唐山华冶钢管制造基本信息,看它为何受市场认可 - 工业品牌热点
  • 我把一个生产Bug的排查过程,交给AI处理——20分钟后我关掉了它
  • 2026年权威盘点:钢塑复合管行业TOP5机构,谁才是性价比
  • Linux内核SLUB调试功能
  • 【Agent Skills】教程!大模型入门到进阶,一套全解决(10)
  • 探讨双工位木纹转印机价格,华宜家在广东费用多少? - 工业设备
  • Docker单容器部署Dify
  • 什么是MIPI SoundWire
  • 28 超越默认:深入理解 Byte Buddy 的自定义 Assigner 与类型转换魔法
  • 2026年山东靠谱的管道支架制造厂排名揭晓 - myqiye
  • 总结国强和茂公司信誉、环保方面及物流配送,如何选择 - 工业推荐榜
  • 【Agent Skills】教程!大模型入门到进阶,一套全解决(11)
  • 告别工具堆砌!桌面智能体KeyVox全能AI助手,办公、创作、生活一站式搞定
  • 从删库到跑路→数据拯救师:测试工程师的涅槃转型
  • 2026成渝老旧小区消防改造服务商推荐榜 - 优质品牌商家
  • Nature Electronics 仿视网膜成像芯片-一种曲面剪纸结构的神经形态成像器
  • Flutter 组件 test_track 适配鸿蒙 HarmonyOS 实战:全链路追踪与灰度治理,构建全场景 A/B 测试与特性分发架构
  • 2026京津冀口碑好的钢管销售公司排名,价格合理的有哪些 - mypinpai
  • 深入理解One-Class SVM:无监督异常检测的精准利器
  • 基于FPGA实现高清HDMI视频输出的实践与探究
  • 从人工到自动:巡检工作的“解放”与“进化”