← 每日面试题 学习看板

BeanFactory和FactroyBean的关系?

面试题/00java/04 框架/01Spring/03依赖注入与配置/BeanFactory和FactroyBean的关系?.md

面试记录 2026-10-27(Round 29)

题目:BeanFactory 和 FactoryBean 的关系?

难度:difficulty/medium

评分:⭐⭐☆☆☆(2/5)

我的回答

beanfactory 是 spring bean 工厂的顶层接口;factoryBean 是一个特殊的类,用于创建其他类;二者没什么关系。

点评

优点:识别出 BeanFactory 是顶层接口、FactoryBean 是特殊类。

不足:"二者没什么关系"是概念错误——两者通过 getBean 关联:getBean("name") 返回 FactoryBean 创建的产品,getBean("&name") 返回 FactoryBean 本身。漏 FactoryBean 的 getObject()/isSingleton()/isEagerInit()。

补充:FactoryBean 是 Spring 用来"绕过容器默认实例化"的钩子,适合第三方类无法直接加注解的场景。


完整讲解(权威版)

最后更新:2026-10-27 · 基于第 1 次作答

L1 · 30 秒速记

结论:BeanFactory 是 IoC 容器接口,FactoryBean 是创建 Bean 的钩子,二者通过 getBean 关联。 关键词:容器接口 · getObject() 产品 · & 前缀取工厂 边界:FactoryBean 只在"无法注解标注/需定制构建"时用。

L2 · 核心讲解

核心考点定位:区分 BeanFactory(容器接口) 与 FactoryBean(工厂钩子)——名字像但职责完全不同,且通过 getBean 关联。面试官想排除"二者无关"的错误认知。

机制链(≥3 环):

  1. 注册 FactoryBean → 容器存的是"工厂"而非产品:为什么——FactoryBean 是实现接口的类,容器先实例化它
  2. getBean("name") → 检测是 FactoryBean → 调 getObject():为什么——容器约定:遇到 FactoryBean 返回产品
  3. getBean("&name") → 返回 FactoryBean 本身:为什么——& 前缀是 Spring 约定,用于拿工厂做定制

证据锚点(≥10):

对比与权衡:

概念本质方法典型
BeanFactory容器接口getBean/containsBean/isSingletonDefaultListableBeanFactory
FactoryBean对象工厂钩子getObject/getObjectType/isSingletonMapperFactoryBean
@Bean 方法配置方法返回实例@Configuration 类

常见误区:

  1. 错误:二者没什么关系 → 正确:getBean 关联(& 前缀约定)→ 为什么:容器能识别 FactoryBean 并调用 getObject
  2. 错误:getBean("x") 返回 FactoryBean 实例 → 正确:返回 getObject() 的产品 → 为什么:容器自动解包
  3. 错误:FactoryBean 是容器 → 正确:是接口钩子,非容器 → 为什么:容器是 BeanFactory,FactoryBean 只定制单个 Bean
  4. 错误:所有类都能用 FactoryBean → 正确:仅第三方/需定制构建类 → 为什么:普通类 @Component 更简单

适用边界:FactoryBean 适用于"无法用注解标注的第三方类"或"需要定制构建逻辑"(如 MyBatis Mapper 代理、AOP 代理对象);普通 Bean 用 @Component/@Bean 更直接,别为用而用。另外注意 FactoryBean 返回的产品也可以注册其他 Bean,但通常单点场景更合适。

延伸追问(≥3)

  1. @Bean 方法返回 FactoryBean 时,getBean 拿到什么?
  1. FactoryBean 的 isSingleton=false 会怎样?
  1. BeanFactoryPostProcessor 和 FactoryBean 都能"动态生成 Bean",区别?

面试者参考回答(400–700 字)

【结论】 面试官您好,BeanFactory 是 IoC 容器接口,FactoryBean 是创建 Bean 的钩子,二者通过 getBean 关联起来。

【三点】 第一,BeanFactory 是容器——管所有 Bean 的定义和生命周期,getBean 是它的核心方法,主要实现是 DefaultListableBeanFactory。第二,FactoryBean 是特殊接口——实现类告诉容器"我的 getObject() 返回值才是要暴露的 Bean",典型是 MyBatis 的 MapperFactoryBean 和 AOP 的 ProxyFactoryBean。第三,关联点——getBean("name") 拿产品,getBean("&name") 拿 FactoryBean 本身,这是 Spring 的 & 前缀约定。

【边界】 当然,FactoryBean 只在"无法用注解标注的类"或"需要定制构建逻辑"时用,普通 Bean 直接用 @Component/@Bean 就行,别为了用而用。


作答历史

#日期评分本轮主要问题记录
12026-10-272/5"二者无关"概念错误,漏 & 前缀约定第 1 次