BeanFactory 和 FactoryBean 有何区别与联系?

news2025/6/9 10:46:22

导语:
Spring 是后端面试中的“常青树”,而 BeanFactoryFactoryBean 的关系更是高频卡人点。很多候选人混淆两者概念,答非所问,轻则失分,重则直接被“pass”。本文将从面试官视角,深入剖析这一经典问题,助你轻松搞定 Spring 框架核心原理面试题!


一、面试主题概述

在 Spring 框架中,BeanFactory 是最基本的 IoC 容器,而 FactoryBean 是一个用于自定义 Bean 实例化逻辑的接口。两者名字相似,却功能迥异。很多面试官喜欢设置此类“概念陷阱”题,考察候选人对 Spring 底层架构的理解是否扎实。


二、高频面试题汇总

  1. BeanFactoryFactoryBean 有什么区别?是否属于同一个功能模块?
  2. 如何使用 FactoryBean 生成一个复杂 Bean?其生命周期是什么?
  3. 如何在代码中获取 FactoryBean 本身而不是它创建的对象?
  4. 在项目中哪些场景适合用 FactoryBean
  5. Spring 的 @Configuration@Bean 背后是否也用到了 FactoryBean 机制?

三、重点题目详解

题目一:BeanFactory 和 FactoryBean 有什么区别?

这个问题是“送命题”也是“送分题”,答得好直接加印象分。

// 假设有一个 FactoryBean 的示例
public class MyCarFactoryBean implements FactoryBean<Car> {
    
    @Override
    public Car getObject() throws Exception {
        // 自定义创建逻辑
        return new Car("Tesla", 2025);
    }

    @Override
    public Class<?> getObjectType() {
        return Car.class;
    }

    @Override
    public boolean isSingleton() {
        return true;
    }
}

答题参考:

  • BeanFactory 是 Spring IoC 容器的最顶层接口,负责管理 Bean 的创建、依赖注入等,是“容器”;

  • FactoryBean 是一个用于“定制某个 Bean 创建过程”的接口,是“容器里的一个特殊 Bean”;

  • 通过 FactoryBean 接口可以封装复杂逻辑,例如:代理类、第三方 Bean 初始化等;

  • 获取方式不同:

    • 获取 FactoryBean 本身:&beanName
    • 获取其生成的对象:beanName

📌 考察点解析:

这类题目重点在于 区分抽象(BeanFactory)与具体(FactoryBean),体现候选人对 Spring IoC 的整体架构是否有清晰理解。


题目二:如何使用 FactoryBean 创建复杂 Bean?能举个实际项目中的例子吗?

答题参考:

例如创建一个加密的 Redis 客户端,可以封装在 FactoryBean 中统一配置:

public class EncryptedRedisClientFactoryBean implements FactoryBean<RedisClient> {

    private String encryptedUrl;

    public void setEncryptedUrl(String encryptedUrl) {
        this.encryptedUrl = encryptedUrl;
    }

    @Override
    public RedisClient getObject() throws Exception {
        String decryptedUrl = AESUtil.decrypt(encryptedUrl);
        return new RedisClient(decryptedUrl);
    }

    @Override
    public Class<?> getObjectType() {
        return RedisClient.class;
    }

    @Override
    public boolean isSingleton() {
        return true;
    }
}

📌 项目实践延伸:

FactoryBean 通常用于:

  • 创建复杂 Bean(如第三方库、加解密对象、代理对象);
  • 延迟加载或条件加载;
  • 集成框架(MyBatis 的 SqlSessionFactoryBean 就是典型代表)。

题目三:如何在容器中获取 FactoryBean 本身?

答题参考:

Spring 通过前缀 & 进行区分:

  • applicationContext.getBean("myFactoryBean"):获取 FactoryBean 创建的对象;
  • applicationContext.getBean("&myFactoryBean"):获取 FactoryBean 本身;

📌 面试官喜欢追问:

这道题往往用于进一步确认候选人是否真正理解 Spring Bean 注册与解析机制。如果能答出 DefaultListableBeanFactory 中的处理逻辑或者 BeanDefinition 的解析顺序,必加分!


四、面试官视角与加分项

为什么爱问?

  • 两者命名相似、容易混淆;
  • 体现对 Spring 核心模块理解;
  • 能区分“容器管理”和“定制创建”的候选人,往往能胜任架构相关工作;

如何打动面试官?

  • 给出实际项目案例:如用 FactoryBean 封装代理类、读取加密配置等;
  • 能说明 Spring 自身如何使用 FactoryBean(如 MapperFactoryBean, ServiceLocatorFactoryBean);
  • 衍生谈及 BeanPostProcessorApplicationContext 的调用链更佳。

五、总结与建议

BeanFactoryFactoryBean 是 Spring 面试绕不过去的坎,也是拉开差距的好机会。记住它们的本质区别——一个是容器,一个是特殊 Bean。建议在面试前梳理它们的使用场景、实际项目案例,以及源码调用流程,做到知其然更知其所以然。

👉 记忆口诀

BeanFactory 是容器,FactoryBean 是工厂;一个管人,一个造物。

希望本文能为你的 Spring 面试添砖加瓦,祝你 offer 多多、面试通关!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2405260.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何做好一份优秀的技术文档:专业指南与最佳实践

如何做好一份优秀的技术文档&#xff1a;专业指南与最佳实践 技术文档是产品开发、用户支持和团队协作的核心工具。高质量的技术文档能够提升开发效率、降低维护成本并改善用户体验。本文将从实践出发&#xff0c;详细讲解如何编写专业、清晰且实用的技术文档。 &#x1f31f;…

TCP相关问题 第一篇

TCP相关问题1 1.TCP主动断开连接方为什么需要等待2MSL 如上图所示:在被动链接方调用close&#xff0c;发送FIN时进入LAST_ACK状态&#xff0c;但未收到主动连接方的ack确认&#xff0c;需要被动连接方重新发送一个FIN&#xff0c;而为什么是2MSL&#xff0c;一般认为丢失ack在…

6.Pandas 数据可视化图-1

第三章 数据可视化 文章目录 目录 第三章 数据可视化 文章目录 前言 一、数据可视化 二、使用步骤 1.pyplot 1.1引入库 1.2 设置汉字字体 1.3 数据准备 1.4 设置索引列 ​编辑 1.5 调用绘图函数 2.使用seaborn绘图 2.1 安装导入seaborn 2.2 设置背景风格 2.3 调用绘图方法 2.…

软件功能测试报告都包含哪些内容?

软件功能测试报告是软件开发生命周期中的重要文档&#xff0c;主要涵盖以下关键内容&#xff1a;    1.测试概况&#xff1a;概述测试目标、范围和方法&#xff0c;确保读者对测试背景有清晰了解。 2.测试环境&#xff1a;详细描述测试所用的硬件、软件环境&#xff0c;确保…

在Vue或React项目中使用Tailwind CSS实现暗黑模式切换:从系统适配到手动控制

在现代Web开发中&#xff0c;暗黑模式(Dark Mode)已成为提升用户体验的重要功能。本文将带你使用Tailwind CSS在React项目(Vue项目类似)中实现两种暗黑模式控制方式&#xff1a; 系统自动适配 - 根据用户设备偏好自动切换手动切换 - 通过按钮让用户自由选择 一、项目准备 使…

Linux--命令行参数和环境变量

1.命令行参数 Linux 命令行参数基础 1.1参数格式 位置参数&#xff1a;无符号&#xff0c;按顺序传递&#xff08;如 ls /home/user 中 /home/user 是位置参数&#xff09; 选项参数&#xff1a; 短选项&#xff1a;以 - 开头&#xff0c;单个字母&#xff08;如 -l 表示长格…

springboot线上教学平台

摘要&#xff1a;在社会快速发展的影响下&#xff0c;使线上教学平台的管理和运营比过去十年更加理性化。依照这一现实为基础&#xff0c;设计一个快捷而又方便的网上线上教学平台系统是一项十分重要并且有价值的事情。对于传统的线上教学平台控制模型来说&#xff0c;网上线上…

mariadb5.5.56在centos7.6环境安装

mariadb5.5.56在centos7.6环境安装 1 下载安装包 https://mariadb.org/mariadb/all-releases/#5-5 2 上传安装包的服务器 mariadb-5.5.56-linux-systemd-x86_64.tar.gz 3 解压安装包 tar -zxvf mariadb-5.5.56-linux-systemd-x86_64.tar.gz mv mariadb-5.5.56-linux-syst…

打造你的 Android 图像编辑器:深入解析 PhotoEditor 开源库

&#x1f4f8; 什么是 PhotoEditor&#xff1f; PhotoEditor 是一个专为 Android 平台设计的开源图像编辑库&#xff0c;旨在为开发者提供简单易用的图像编辑功能。它支持绘图、添加文本、应用滤镜、插入表情符号和贴纸等功能&#xff0c;类似于 Instagram 的编辑体验。该库采…

Azure 虚拟机端口资源:专用 IP 和公共 IP Azure Machine Learning 计算实例BUG

## 报错无解 找不到Azure ML 计算实例关联的 NSG .env 文件和 ufw status&#xff1a; .env 文件中 EXPOSE_NGINX_PORT8080 是正确的&#xff0c;它告诉 docker-compose.yaml 将 Nginx 暴露在宿主机的 8080 端口。 sudo ufw status 显示 Status: inactive&#xff0c;意味着宿…

Java核心技术-卷I-读书笔记(第十二版)

第一章 Java程序设计概述 09年sun被oracle收购->11年java7&#xff08;简单改进&#xff09;->14年java8&#xff08;函数式编程&#xff09;->2017年java9->2018年java11->2021年java17 第二章 Java编程环境 Java9后新增JShell&#xff0c;提供类似脚本试执…

MATLAB遍历生成20到1000个节点的无线通信网络拓扑推理数据

功能&#xff1a; 遍历生成20到1000个节点的无线通信网络拓扑推理数据&#xff0c;包括网络拓扑和每个节点发射的电磁信号&#xff0c;采样率1MHz/3000&#xff0c;信号时长5.7s&#xff0c;单帧数据波形为实采 数据生成效果&#xff1a; 拓扑及空间位置&#xff1a; 节点电磁…

卫星接收天线G/T值怎么计算?附G/T计算excel表格链接

我们在进行无线通信链路设计时&#xff0c;都会涉及接收天线最重要的参数G/T。今天&#xff0c;咱们就来聊聊G/T值该怎么计算&#xff0c;计算过程中有哪些需要留意的地方&#xff0c;以及当你看到产品说明书中标注了G/T指标&#xff0c;还需要进一步了解哪些信息。 G/T的含义 …

基于dify的营养分析工作流:3分钟生成个人营养分析报告

你去医院做体检&#xff0c;需要多久拿到体检报告呢&#xff1f;医院会为每位病人做一份多维度的健康报告吗&#xff1f;"人工报告需1小时/份&#xff1f;数据误差率高达35%&#xff1f;传统工具无法个性化&#xff1f; Dify工作流AI模型的组合拳&#xff0c;正在重塑健康…

新成果:GaN基VCSEL动态物理模型开发

作为高速数据传输与光电信号处理的核心器件&#xff0c;垂直腔面发射激光器&#xff08;VCSEL&#xff09;在高速光通信、激光雷达等领域应用广泛&#xff0c;其动态特性直接关联器件调制速率及稳定性等关键参数。近期&#xff0c;天津赛米卡尔科技有限公司技术团队开发了GaN基…

Appium+python自动化(十一)- 元素定位- 下

1、 List定位 List顾名思义就是一个列表&#xff0c;在python里面也有list这一个说法&#xff0c;如果你不是很理解什么是list&#xff0c;这里暂且理解为一个数组或者说一个集合。首先一个list是一个集合&#xff0c;那么他的个数也就成了不确定性&#xff0c;所以这里需要用复…

免费批量PDF转Word工具

免费批量PDF转Word工具 工具简介 这是一款简单易用的批量PDF转Word工具&#xff0c;支持&#xff1a; 批量转换多个PDF文件保留原始格式和布局快速高效的转换速度完全免费使用 工具地址 下载链接 网盘下载地址&#xff1a;点击下载 提取码&#xff1a;8888 功能特点 ✅…

Mac/iOS 如何解压 RAR 格式压缩包:常用工具与详细操作步骤

一、Mac 系统解压 RAR 文件之法 Mac 系统上解压 RAR 文件有多种方法&#xff0c;除了系统自带的一些简单功能外&#xff0c;还可以借助特定的软件来实现高效解压。以下将介绍几款常用工具的解压操作。 &#xff08;一&#xff09;解压专家解压步骤 解压专家 是一款在 Mac 和 …

机器学习监督学习实战四:九种回归算法对波士顿房价数据进行回归预测和评估方法可视化

本项目代码在个人github链接&#xff1a;https://github.com/KLWU07/Machine-learning-Project-practice/tree/main 处理流程 1.导入波士顿房价数据集并进行预处理。2.使用 GradientBoostingRegressor 模型进行回归分析。3.通过交叉验证评估模型的性能&#xff0c;计算 MAE、…

微软重磅发布Magentic UI,交互式AI Agent助手实测!

微软重磅发布Magentic UI,交互式AI Agent助手实测! 何为Magentic UI? Magentic UI 是微软于5.19重磅发布的开源Agent助手,并于24日刚更新了第二个版本0.04版 从官方的介绍来看,目标是打造一款 以人为中心 的智能助手,其底层由多个不同的智能体系统驱动,能够实现网页浏览…