导语:
Spring 是后端面试中的“常青树”,而 BeanFactory
与 FactoryBean
的关系更是高频卡人点。很多候选人混淆两者概念,答非所问,轻则失分,重则直接被“pass”。本文将从面试官视角,深入剖析这一经典问题,助你轻松搞定 Spring 框架核心原理面试题!
在 Spring 框架中,BeanFactory
是最基本的 IoC 容器,而 FactoryBean
是一个用于自定义 Bean 实例化逻辑的接口。两者名字相似,却功能迥异。很多面试官喜欢设置此类“概念陷阱”题,考察候选人对 Spring 底层架构的理解是否扎实。
BeanFactory
和 FactoryBean
有什么区别?是否属于同一个功能模块?FactoryBean
生成一个复杂 Bean?其生命周期是什么?FactoryBean
本身而不是它创建的对象?FactoryBean
?@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
通常用于:
SqlSessionFactoryBean
就是典型代表)。题目三:如何在容器中获取 FactoryBean 本身?
✅ 答题参考:
Spring 通过前缀 &
进行区分:
applicationContext.getBean("myFactoryBean")
:获取 FactoryBean 创建的对象;applicationContext.getBean("&myFactoryBean")
:获取 FactoryBean 本身;面试官喜欢追问:
这道题往往用于进一步确认候选人是否真正理解 Spring Bean 注册与解析机制。如果能答出 DefaultListableBeanFactory
中的处理逻辑或者 BeanDefinition
的解析顺序,必加分!
✅ 为什么爱问?
✨ 如何打动面试官?
FactoryBean
封装代理类、读取加密配置等;FactoryBean
(如 MapperFactoryBean
, ServiceLocatorFactoryBean
);BeanPostProcessor
、ApplicationContext
的调用链更佳。BeanFactory
与 FactoryBean
是 Spring 面试绕不过去的坎,也是拉开差距的好机会。记住它们的本质区别——一个是容器,一个是特殊 Bean。建议在面试前梳理它们的使用场景、实际项目案例,以及源码调用流程,做到知其然更知其所以然。
记忆口诀:
BeanFactory 是容器,FactoryBean 是工厂;一个管人,一个造物。
希望本文能为你的 Spring 面试添砖加瓦,祝你 offer 多多、面试通关!