导语:
Spring 是后端面试中的“常青树”,而 BeanFactory
与 FactoryBean
的关系更是高频卡人点。很多候选人混淆两者概念,答非所问,轻则失分,重则直接被“pass”。本文将从面试官视角,深入剖析这一经典问题,助你轻松搞定 Spring 框架核心原理面试题!
一、面试主题概述
在 Spring 框架中,BeanFactory
是最基本的 IoC 容器,而 FactoryBean
是一个用于自定义 Bean 实例化逻辑的接口。两者名字相似,却功能迥异。很多面试官喜欢设置此类“概念陷阱”题,考察候选人对 Spring 底层架构的理解是否扎实。
二、高频面试题汇总
BeanFactory
和FactoryBean
有什么区别?是否属于同一个功能模块?- 如何使用
FactoryBean
生成一个复杂 Bean?其生命周期是什么? - 如何在代码中获取
FactoryBean
本身而不是它创建的对象? - 在项目中哪些场景适合用
FactoryBean
? - 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
); - 衍生谈及
BeanPostProcessor
、ApplicationContext
的调用链更佳。
五、总结与建议
BeanFactory
与 FactoryBean
是 Spring 面试绕不过去的坎,也是拉开差距的好机会。记住它们的本质区别——一个是容器,一个是特殊 Bean。建议在面试前梳理它们的使用场景、实际项目案例,以及源码调用流程,做到知其然更知其所以然。
👉 记忆口诀:
BeanFactory 是容器,FactoryBean 是工厂;一个管人,一个造物。
希望本文能为你的 Spring 面试添砖加瓦,祝你 offer 多多、面试通关!