news 2026/4/18 11:01:10

BeanFactory 和 FactoryBean区别

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
BeanFactory 和 FactoryBean区别

简单来说,BeanFactorySpring IoC 容器的根接口(“容器本身”),而FactoryBean自定义 Bean 创建逻辑的工厂接口(“创建 Bean 的工厂”),两者的角色和职责天差地别。

一、核心概念与区别(先看表格,一目了然)

维度BeanFactoryFactoryBean
核心定位Spring IoC 容器的根接口(“容器”)特殊的 Bean 类型(“工厂 Bean”),用于创建复杂 Bean
核心作用管理所有 Bean 的生命周期(实例化、配置、依赖注入、获取 Bean)自定义 Bean 的创建过程(解决复杂 Bean 的初始化问题)
使用方式开发者直接调用其方法(如getBean())获取 Bean开发者实现该接口,Spring 自动调用其方法创建 Bean
核心方法getBean(String name)containsBean()getObject()getObjectType()isSingleton()
关系是所有 Spring 容器的基础,包含 / 管理 FactoryBean是被 BeanFactory 管理的一种特殊 Bean

二、详细解析 + 代码示例

1. BeanFactory:Spring IoC 容器的 “根”

BeanFactory是 Spring 最基础的 IoC 容器接口,定义了 IoC 容器的核心规范:负责定位、加载、实例化、配置 Bean,并提供 Bean 的获取和管理能力

你可以把它理解为 “Bean 的仓库管理员”—— 所有 Bean 都由它管理,你要获取 Bean 时,只需告诉它 Bean 的名称 / 类型,它就会返回对应的实例。

核心特点:
  • 是 ApplicationContext(我们常用的容器)的父接口,ApplicationContext 在其基础上扩展了国际化、事件发布、资源加载等功能;
  • 采用延迟加载(懒加载):只有调用getBean()时才实例化 Bean(ApplicationContext 默认预加载);
  • 所有 Spring 容器都实现了该接口(如DefaultListableBeanFactoryXmlBeanFactory)。
代码示例:使用 BeanFactory 获取 Bean
import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.core.io.ClassPathResource; // 普通Bean类 class User { private String name; // 构造器、getter/setter省略 public User(String name) { this.name = name; } @Override public String toString() { return "User{name='" + name + "'}"; } } public class BeanFactoryDemo { public static void main(String[] args) { // 1. 创建BeanFactory容器(加载xml配置,模拟传统方式) BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("beans.xml")); // 2. 从容器中获取Bean(此时才实例化User) User user = (User) beanFactory.getBean("user"); System.out.println(user); // 输出:User{name='张三'} } } // beans.xml配置(放在resources目录下) /* <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="user" class="User"> <constructor-arg value="张三"/> </bean> </beans> */
2. FactoryBean:自定义 Bean 创建的 “工厂”

FactoryBean是一个特殊的 Bean 接口—— 当 Spring 容器发现一个 Bean 实现了FactoryBean,不会直接返回这个 Bean 本身,而是调用它的getObject()方法,返回该方法创建的实例。

你可以把它理解为 “复杂 Bean 的定制化工厂”:当某个 Bean 的创建逻辑很复杂(比如需要连接数据库、初始化第三方组件、多步配置),直接通过 xml / 注解配置太繁琐时,就可以实现FactoryBean来封装创建逻辑。

核心方法:
方法名作用
T getObject()核心方法,返回最终要使用的 Bean 实例
Class<?> getObjectType()返回getObject()创建的 Bean 的类型
boolean isSingleton()返回创建的 Bean 是否为单例(默认 true)
代码示例:实现 FactoryBean 创建复杂 Bean

比如创建一个需要初始化的RedisConnectionBean(模拟复杂 Bean):

import org.springframework.beans.factory.FactoryBean; // 模拟复杂的Redis连接类 class RedisConnection { private String host; private int port; // 复杂初始化逻辑:比如建立连接、认证等 public RedisConnection(String host, int port) { this.host = host; this.port = port; System.out.println("初始化Redis连接:" + host + ":" + port); } @Override public String toString() { return "RedisConnection{host='" + host + "', port=" + port + "}"; } } // 实现FactoryBean,封装RedisConnection的创建逻辑 class RedisConnectionFactoryBean implements FactoryBean<RedisConnection> { private String host; private int port; // 配置参数(可通过xml/注解注入) public void setHost(String host) { this.host = host; } public void setPort(int port) { this.port = port; } // 核心:创建RedisConnection实例 @Override public RedisConnection getObject() throws Exception { // 这里可以写复杂的创建逻辑:比如读取配置、校验参数、初始化连接池等 return new RedisConnection(host, port); } // 返回创建的Bean类型 @Override public Class<?> getObjectType() { return RedisConnection.class; } // 单例模式(默认true) @Override public boolean isSingleton() { return true; } } // 测试使用FactoryBean public class FactoryBeanDemo { public static void main(String[] args) { // 1. 创建Spring容器 BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("beans.xml")); // 2. 获取Bean:容器会调用RedisConnectionFactoryBean的getObject(),返回RedisConnection RedisConnection redisConn = (RedisConnection) beanFactory.getBean("redisConnection"); System.out.println(redisConn); // 输出:RedisConnection{host='127.0.0.1', port=6379} // 3. 若要获取FactoryBean本身(而非它创建的Bean),需在名称前加& RedisConnectionFactoryBean factoryBean = (RedisConnectionFactoryBean) beanFactory.getBean("&redisConnection"); System.out.println(factoryBean); // 输出FactoryBean实例本身 } } // beans.xml配置 /* <bean id="redisConnection" class="RedisConnectionFactoryBean"> <property name="host" value="127.0.0.1"/> <property name="port" value="6379"/> </bean> */

三、关键补充:容易踩的坑

  1. 获取 FactoryBean 本身的方式:默认beanFactory.getBean("xxx")返回的是FactoryBean创建的 Bean;若要获取FactoryBean实例本身,需在 Bean 名称前加&(如&redisConnection)。
  2. FactoryBean 的适用场景
    • 整合第三方组件(如 MyBatis 的SqlSessionFactoryBean、Redis 的RedisTemplateFactoryBean);
    • 创建需要复杂初始化逻辑的 Bean(如连接池、线程池、分布式锁客户端);
    • 动态创建 Bean(根据不同配置返回不同实例)。
  3. BeanFactory 的扩展:日常开发中很少直接使用BeanFactory,而是用它的子接口ApplicationContext(包含 BeanFactory 所有功能,且支持注解、事件、国际化等)。

总结

  1. 角色本质不同BeanFactory是 Spring IoC 容器的核心接口(“容器”),管理所有 Bean;FactoryBean是特殊的 Bean(“工厂”),用于创建特定的复杂 Bean。
  2. 使用目的不同BeanFactory解决 “Bean 的统一管理” 问题;FactoryBean解决 “复杂 Bean 的定制化创建” 问题。
  3. 调用逻辑不同:开发者调用BeanFactorygetBean()获取 Bean;Spring 容器调用FactoryBeangetObject()生成 Bean。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 16:41:11

大模型微调实战:5个关键步骤,从零构建高效微调数据集!

想让大语言模型&#xff08;LLM&#xff09;变得更聪明、更贴合你的需求&#xff1f;那就得靠微调&#xff08;fine-tuning&#xff09;&#xff01;而微调的关键在于一个精心准备的数据集。 本文将带你一步步了解如何创建和准备一个适合LLM微调的数据集&#xff0c;特别聚焦于…

作者头像 李华
网站建设 2026/4/18 9:42:54

嘉立创3D打印材料库全揭秘:从尼龙到钛合金,精准匹配您的每一个需求

现代制造业中&#xff0c;材料的选择深刻影响着产品的最终性能。无论是原型验证到功能测试&#xff0c;从小批量定制到终端生产&#xff0c;不同阶段对材料性能有着截然不同的要求。嘉立创3D打印构建的材料生态系统&#xff0c;正是为满足这种多元化需求而生。一、四大类材料覆…

作者头像 李华
网站建设 2026/4/17 12:17:03

开题报告 springboot和vue超市管理山西大学

目录 开题报告背景技术选型依据系统功能模块山西大学相关应用实施建议 项目技术支持可定制开发之功能亮点源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作 开题报告背景 超市管理系统作为现代零售业的核心工具&#xff0c;能够提升商品管理…

作者头像 李华
网站建设 2026/4/18 7:03:04

大模型智能体设计模式深度解析,小白也能快速上手

本文解析大模型智能体设计的八大核心模式&#xff1a;配备计算机权限、多层级行动空间、循序渐进信息展开、文件系统管理上下文、缓存机制应用、子智能体隔离、智能体持续进化等。这些模式有效解决长上下文性能下降问题&#xff0c;通过动态加载工具定义、卸载上下文到文件系统…

作者头像 李华
网站建设 2026/4/18 8:28:40

毕设 深度学习YOLO交通路面缺陷检测系统(源码+论文)

文章目录 0 前言1 项目运行效果2 课题背景2.1. 道路基础设施发展现状2.2. 路面缺陷检测技术演进历程2.2.1 传统检测方法2.2.2 机械化检测阶段 2.3. 计算机视觉技术突破2.3.1 传统图像处理技术2.3.2 深度学习革命 2.4. 路面缺陷检测的特殊性挑战2.4.1 数据特性2.4.2 技术难点 2.…

作者头像 李华
网站建设 2026/4/18 8:31:35

MIPI与ISP

在 MIPI 摄像头的嵌入式视觉系统中&#xff0c;ISP&#xff08;Image Signal Processor&#xff0c;图像信号处理器&#xff09; 是连接 MIPI CSI-2 接口与上层应用的关键硬件模块&#xff0c;核心作用是对摄像头传感器输出的原始图像数据进行实时处理&#xff0c;将 RAW 格式的…

作者头像 李华