题目: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 次作答
结论:BeanFactory 是 IoC 容器接口,FactoryBean 是创建 Bean 的钩子,二者通过 getBean 关联。 关键词:容器接口 · getObject() 产品 · & 前缀取工厂 边界:FactoryBean 只在"无法注解标注/需定制构建"时用。
核心考点定位:区分 BeanFactory(容器接口) 与 FactoryBean(工厂钩子)——名字像但职责完全不同,且通过 getBean 关联。面试官想排除"二者无关"的错误认知。
机制链(≥3 环):
证据锚点(≥10):
BeanFactory:容器顶层接口getBean(String):按名取 BeanFactoryBean<T>:对象工厂接口getObject():返回实际要暴露的 BeangetObjectType():返回产品类型isSingleton():是否单例产品& 前缀:getBean 取 FactoryBean 本身DefaultListableBeanFactory:BeanFactory 主要实现MapperFactoryBean:MyBatis 典型 FactoryBeanProxyFactoryBean:AOP 典型 FactoryBean对比与权衡:
| 概念 | 本质 | 方法 | 典型 |
|---|---|---|---|
| BeanFactory | 容器接口 | getBean/containsBean/isSingleton | DefaultListableBeanFactory |
| FactoryBean | 对象工厂钩子 | getObject/getObjectType/isSingleton | MapperFactoryBean |
| @Bean 方法 | 配置方法 | 返回实例 | @Configuration 类 |
常见误区:
适用边界:FactoryBean 适用于"无法用注解标注的第三方类"或"需要定制构建逻辑"(如 MyBatis Mapper 代理、AOP 代理对象);普通 Bean 用 @Component/@Bean 更直接,别为用而用。另外注意 FactoryBean 返回的产品也可以注册其他 Bean,但通常单点场景更合适。
【结论】 面试官您好,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 就行,别为了用而用。
| # | 日期 | 评分 | 本轮主要问题 | 记录 |
|---|---|---|---|---|
| 1 | 2026-10-27 | 2/5 | "二者无关"概念错误,漏 & 前缀约定 | 第 1 次 |