【手写Easy-Spring|1】
Spring Bean工厂原理与类关系详解一、核心概念1.1 BeanBean是由Spring容器管理的对象可以是任何Java类的实例。Spring容器负责Bean的创建、初始化、配置和管理生命周期。1.2 Bean工厂Bean工厂BeanFactory是Spring框架中负责创建和管理Bean的核心组件主要职责包括管理Bean的定义信息创建Bean实例管理Bean的生命周期处理Bean之间的依赖关系1.3 Bean定义BeanDefinition是描述Bean元数据信息的对象包含创建Bean所需的所有信息Bean的类型ClassBean的作用域单例、原型等Bean的初始化方法Bean的销毁方法Bean的依赖关系二、核心接口与类2.1 BeanFactory接口BeanFactory是Bean工厂的顶级接口定义了获取Bean的基本方法。public interface BeanFactory { Object getBean(String beanName) throws BeansException; Object getBean(String beanName, Object... args) throws BeansException; }2.2 BeanDefinition类BeanDefinition类定义了Bean的元数据信息。public class BeanDefinition { private Class beanClass; public BeanDefinition(Class beanClass) { this.beanClass beanClass; } public Class getBeanClass() { return beanClass; } public void setBeanClass(Class beanClass) { this.beanClass beanClass; } }2.3 BeansException类BeansException是Spring中处理Bean相关异常的基类。public class BeansException extends RuntimeException { public BeansException() { super(); } public BeansException(String message) { super(message); } public BeansException(String message, Throwable cause) { super(message, cause); } }三、实现类详解3.1 DefaultSingletonBeanRegistryDefaultSingletonBeanRegistry是SingletonBeanRegistry接口的默认实现使用HashMap存储单例Bean实例。public class DefaultSingletonBeanRegistry implements SingletonBeanRegistry { private MapString, Object singletonObjects new HashMap(); Override public void registerSingleton(String beanName, Object singleton) { singletonObjects.put(beanName, singleton); } Override public Object getSingleton(String beanName) { return singletonObjects.get(beanName); } }3.2 AbstractBeanFactoryAbstractBeanFactory是BeanFactory接口的抽象实现继承自DefaultSingletonBeanRegistry。它实现了Bean的获取逻辑管理单例Bean的缓存并定义了创建Bean的抽象方法。public abstract class AbstractBeanFactory extends DefaultSingletonBeanRegistry implements BeanFactory { Override public Object getBean(String beanName) throws BeansException { Object singleton getSingleton(beanName); if (singleton ! null) { return singleton; } BeanDefinition beanDefinition getBeanDefinition(beanName); return createBean(beanName, beanDefinition); } Override public Object getBean(String beanName, Object... args) throws BeansException { Object singleton getSingleton(beanName); if (singleton ! null) { return singleton; } BeanDefinition beanDefinition getBeanDefinition(beanName); return createBean(beanName, beanDefinition, args); } protected abstract BeanDefinition getBeanDefinition(String beanName) throws BeansException; protected abstract Object createBean(String beanName, BeanDefinition beanDefinition) throws BeansException; protected abstract Object createBean(String beanName, BeanDefinition beanDefinition, Object... args) throws BeansException; }3.3 AbstractAutowireCapableBeanFactoryAbstractAutowireCapableBeanFactory实现了创建Bean的具体逻辑使用InstantiationStrategy接口来创建Bean实例。public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory { private InstantiationStrategy instantiationStrategy new SimpleInstantiationStrategy(); Override protected Object createBean(String beanName, BeanDefinition beanDefinition) throws BeansException { return createBean(beanName, beanDefinition, null); } Override protected Object createBean(String beanName, BeanDefinition beanDefinition, Object... args) throws BeansException { Object bean null; try { bean createBeanInstance(beanDefinition, beanName, args); } catch (Exception e) { throw new BeansException(Instantiation of bean failed, e); } registerSingleton(beanName, bean); return bean; } protected Object createBeanInstance(BeanDefinition beanDefinition, String beanName, Object... args) throws BeansException { Constructor constructor null; Class? beanClass beanDefinition.getBeanClass(); Constructor?[] declaredConstructors beanClass.getDeclaredConstructors(); for (Constructor? ctor : declaredConstructors) { if (args ! null ctor.getParameterTypes().length args.length) { constructor ctor; break; } } return getInstantiationStrategy().instantiate(beanDefinition, beanName, constructor, args); } public InstantiationStrategy getInstantiationStrategy() { return instantiationStrategy; } public void setInstantiationStrategy(InstantiationStrategy instantiationStrategy) { this.instantiationStrategy instantiationStrategy; } }3.4 DefaultListableBeanFactoryDefaultListableBeanFactory是Spring Bean工厂的核心实现类实现了BeanDefinitionRegistry接口和继承了AbstractAutowireCapableBeanFactory。public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory implements BeanDefinitionRegistry { private MapString, BeanDefinition beanDefinitionMap new HashMap(); Override public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition) { beanDefinitionMap.put(beanName, beanDefinition); } Override protected BeanDefinition getBeanDefinition(String beanName) throws BeansException { BeanDefinition beanDefinition beanDefinitionMap.get(beanName); if (beanDefinition null) { throw new BeansException(No bean named beanName is defined); } return beanDefinition; } }3.5 InstantiationStrategy接口及实现InstantiationStrategy接口定义了Bean实例化的策略有两个实现类SimpleInstantiationStrategy使用Java反射机制创建Bean实例。public class SimpleInstantiationStrategy implements InstantiationStrategy { Override public Object instantiate(BeanDefinition beanDefinition, String beanName, Constructor ctor, Object[] args) throws BeansException { Class? beanClass beanDefinition.getBeanClass(); try { if (ctor ! null) { return beanClass.getDeclaredConstructor(ctor.getParameterTypes()).newInstance(args); } else { return beanClass.getDeclaredConstructor().newInstance(); } } catch (Exception e) { throw new BeansException(Failed to instantiate [ beanClass.getName() ], e); } } }CglibInstantiationStrategy使用Cglib库创建Bean实例支持更复杂的场景。public class CglibInstantiationStrategy implements InstantiationStrategy { Override public Object instantiate(BeanDefinition beanDefinition, String beanName, Constructor ctor, Object[] args) throws BeansException { try { Enhancer enhancer new Enhancer(); enhancer.setSuperclass(beanDefinition.getBeanClass()); enhancer.setCallback(new NoOp() { Override public int hashCode() { return super.hashCode(); } }); if (ctor ! null) { return enhancer.create(ctor.getParameterTypes(), args); } else { return enhancer.create(); } } catch (Exception e) { throw new BeansException(Failed to instantiate [ beanDefinition.getBeanClass().getName() ], e); } } }四、类关系图4.1 继承关系BeanFactory ↑ AbstractBeanFactory ↑ AbstractAutowireCapableBeanFactory ↑ DefaultListableBeanFactory DefaultSingletonBeanRegistry ↑ AbstractBeanFactory4.2 实现关系DefaultListableBeanFactory implements BeanDefinitionRegistryDefaultSingletonBeanRegistry implements SingletonBeanRegistrySimpleInstantiationStrategy implements InstantiationStrategyCglibInstantiationStrategy implements InstantiationStrategy4.3 组合关系AbstractAutowireCapableBeanFactory组合了InstantiationStrategyDefaultListableBeanFactory组合了BeanDefinition的存储五、Bean生命周期5.1 生命周期阶段Bean定义阶段通过BeanDefinition描述Bean的元数据信息Bean注册阶段将BeanDefinition注册到BeanDefinitionRegistry中Bean实例化阶段根据BeanDefinition创建Bean实例Bean初始化阶段对Bean实例进行初始化如设置属性、处理依赖注入等Bean使用阶段Bean实例被应用程序使用Bean销毁阶段Bean实例被销毁单例Bean5.2 实例化策略使用无参构造函数如果Bean类有无参构造函数直接使用反射创建实例使用带参构造函数如果Bean类只有带参构造函数使用反射或Cglib创建实例使用工厂方法通过指定的工厂方法创建实例使用工厂Bean通过实现FactoryBean接口的Bean创建实例六、Bean作用域6.1 单例作用域SingletonSpring的默认作用域一个Bean定义在Spring容器中只会创建一个实例所有对该Bean的请求都会返回同一个实例。优点节省内存、提高性能、共享状态缺点线程安全问题、状态管理复杂6.2 原型作用域Prototype每次请求Bean时都会创建一个新的实例适用于需要频繁创建和销毁的对象。优点线程安全、状态隔离缺点内存消耗大、性能较低6.3 Web应用作用域Request每个HTTP请求创建一个新的Bean实例Session每个HTTP会话创建一个新的Bean实例GlobalSession每个全局HTTP会话创建一个新的Bean实例Portlet应用七、依赖注入7.1 构造函数注入通过Bean的构造函数来注入依赖关系。public class UserService { private final UserDao userDao; Autowired public UserService(UserDao userDao) { this.userDao userDao; } }优点确保Bean在创建时就拥有所有必要的依赖、避免了循环依赖、提高了代码的可读性和可测试性7.2 Setter方法注入通过Bean的Setter方法来注入依赖关系。public class UserService { private UserDao userDao; Autowired public void setUserDao(UserDao userDao) { this.userDao userDao; } }优点支持可选依赖、支持依赖的动态修改、简化了单元测试7.3 字段注入通过注解直接注入到Bean的字段中。public class UserService { Autowired private UserDao userDao; }优点代码简洁、减少了样板代码缺点破坏了封装性、使依赖关系不明确、难以进行单元测试八、自动装配8.1 自动装配模式no默认值不进行自动装配byName根据属性名称自动装配byType根据属性类型自动装配constructor根据构造函数参数类型自动装配autodetect自动检测使用constructor或byType模式8.2 优缺点优点减少手动配置的工作量、提高配置的可读性和可维护性、减少配置错误的可能性缺点依赖关系不够明确、可能导致意外的依赖注入、不支持复杂的依赖关系九、工作原理9.1 初始化阶段加载配置Spring容器加载配置文件或注解解析Bean定义注册Bean定义将解析后的Bean定义注册到BeanDefinitionRegistry中初始化单例Bean对于单例作用域的Bean在容器启动时就创建实例9.2 获取Bean阶段检查缓存首先检查单例缓存中是否存在Bean实例创建Bean如果缓存中不存在则创建Bean实例获取Bean定义实例化Bean初始化Bean缓存单例Bean返回Bean返回Bean实例给调用者9.3 销毁阶段关闭容器当应用程序关闭时关闭Spring容器销毁单例Bean调用单例Bean的销毁方法十、应用示例10.1 基本使用DefaultListableBeanFactory beanFactory new DefaultListableBeanFactory(); BeanDefinition beanDefinition new BeanDefinition(UserService.class); beanFactory.registerBeanDefinition(userService, beanDefinition); UserService userService (UserService) beanFactory.getBean(userService); userService.queryUserInfo();10.2 带参数的构造函数DefaultListableBeanFactory beanFactory new DefaultListableBeanFactory(); BeanDefinition beanDefinition new BeanDefinition(UserServiceWithConstructor.class); beanFactory.registerBeanDefinition(userServiceWithConstructor, beanDefinition); UserServiceWithConstructor userService (UserServiceWithConstructor) beanFactory.getBean(userServiceWithConstructor, test, 25); userService.queryUserInfo();10.3 使用不同的实例化策略DefaultListableBeanFactory beanFactory new DefaultListableBeanFactory(); ((AbstractAutowireCapableBeanFactory) beanFactory).setInstantiationStrategy(new CglibInstantiationStrategy()); BeanDefinition beanDefinition new BeanDefinition(UserServiceWithConstructor.class); beanFactory.registerBeanDefinition(userServiceWithConstructor, beanDefinition); UserServiceWithConstructor userService (UserServiceWithConstructor) beanFactory.getBean(userServiceWithConstructor, test, 25); userService.queryUserInfo();十一、扩展点11.1 自定义BeanPostProcessor允许在Bean初始化前后对Bean进行处理。public class MyBeanPostProcessor implements BeanPostProcessor { Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { System.out.println(Before initialization: beanName); return bean; } Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { System.out.println(After initialization: beanName); return bean; } }11.2 自定义FactoryBean允许自定义Bean的创建过程。public class MyFactoryBean implements FactoryBeanUserService { Override public UserService getObject() throws Exception { return new UserService(); } Override public Class? getObjectType() { return UserService.class; } Override public boolean isSingleton() { return true; } }11.3 自定义InstantiationStrategy允许自定义Bean的实例化策略。public class MyInstantiationStrategy implements InstantiationStrategy { Override public Object instantiate(BeanDefinition beanDefinition, String beanName, Constructor ctor, Object[] args) throws BeansException { System.out.println(Instantiating bean: beanName); Class? beanClass beanDefinition.getBeanClass(); try { if (ctor ! null) { return beanClass.getDeclaredConstructor(ctor.getParameterTypes()).newInstance(args); } else { return beanClass.getDeclaredConstructor().newInstance(); } } catch (Exception e) { throw new BeansException(Failed to instantiate [ beanClass.getName() ], e); } } }十二、最佳实践12.1 使用注解配置注解配置更加简洁、直观。Component public class UserService { } Configuration ComponentScan(com.example) public class AppConfig { }12.2 合理使用作用域对于无状态的Bean使用单例作用域对于有状态的Bean使用原型作用域对于Web应用根据需要使用request、session等作用域12.3 避免循环依赖循环依赖是指两个或多个Bean之间相互依赖Spring可以处理构造函数注入以外的循环依赖但最好避免。12.4 使用构造函数注入构造函数注入是Spring推荐的依赖注入方式它可以确保Bean在创建时就拥有所有必要的依赖。12.5 使用Qualifier注解当存在多个同类型的Bean时使用Qualifier注解指定要注入的Bean名称。Component public class UserService { private final UserDao userDao; Autowired public UserService(Qualifier(userDaoImpl) UserDao userDao) { this.userDao userDao; } }12.6 使用Value注解使用Value注解注入配置值提高配置的灵活性。Component public class UserService { Value(${user.service.name}) private String name; }十三、常见问题与解决方案13.1 NoSuchBeanDefinitionException原因找不到指定名称的Bean定义解决方案检查Bean名称是否正确、检查Bean是否已注册、检查配置是否正确13.2 BeanCreationException原因Bean创建失败解决方案检查Bean的构造函数是否正确、检查Bean的依赖是否存在、检查Bean的初始化方法是否正确13.3 UnsatisfiedDependencyException原因依赖注入失败解决方案检查依赖的Bean是否存在、检查依赖的类型是否匹配、检查自动装配的配置是否正确13.4 CircularDependencyException原因循环依赖解决方案重构代码消除循环依赖、使用Setter方法注入代替构造函数注入、使用Lazy注解延迟加载13.5 NoClassDefFoundError原因找不到类定义解决方案检查依赖是否正确、检查类路径是否正确、检查版本是否兼容13.6 IllegalArgumentException原因参数非法解决方案检查方法参数是否正确、检查配置值是否正确、检查Bean定义是否正确十四、总结Spring Bean工厂是Spring框架的核心组件它通过管理Bean的定义、创建和生命周期为应用程序提供了一种灵活、可配置的对象管理机制。核心优势灵活性支持多种配置方式和实例化策略可扩展性提供了丰富的扩展点可靠性成熟稳定的实现易用性简洁直观的API通过理解Spring Bean工厂的原理和类与类之间的关系开发者可以更好地掌握Spring框架的工作机制构建高质量的应用程序。作为开发者我们应该不断学习和掌握Spring框架的新特性和最佳实践以提高开发效率和代码质量。

相关新闻

S7-1500作控制器S7-200SMART作智能设备

S7-1500作控制器S7-200SMART作智能设备

本文介绍了智能设备的功能,将S7-1500作为控制器,S7-200 SMART为智能设备,智能设备生成GSD文件,进行 PROFINET IO 通信的配置示例。 从 S7-200 SMART V2.5 版本开始,S7-200 SMART 开始支持做 PROFINET IO 通信的智能设…

2026/7/5 8:35:29 阅读更多 →
一个程序模拟 直流绝缘监测仪,一个程序模拟 直流绝缘监测仪上位机

一个程序模拟 直流绝缘监测仪,一个程序模拟 直流绝缘监测仪上位机

按照文档写了两个代码,模拟下面这个 直流绝缘检测仪

2026/7/3 18:33:04 阅读更多 →
低空经济新实践:无人机如何革新光伏电站巡检

低空经济新实践:无人机如何革新光伏电站巡检

引言:当低空经济遇见新能源革命在“双碳”战略引领下,光伏电站如雨后春笋般遍布神州大地。截至2023年底,我国光伏发电装机容量已突破6亿千瓦,连续多年位居全球首位。然而,随着光伏电站规模的急剧扩大,传统人…

2026/7/4 18:56:57 阅读更多 →

最新新闻

SONiC 2024 容器化架构解析:10个核心Docker容器如何驱动网络转发

SONiC 2024 容器化架构解析:10个核心Docker容器如何驱动网络转发

SONiC 2024容器化架构深度解析:10个核心容器如何构建下一代云网络1. 现代网络操作系统的容器化革命当微软在2016年首次开源SONiC项目时,很少有人能预料到这个基于Linux的网络操作系统会彻底改变数据中心网络的构建方式。八年后的今天,SONiC已…

2026/7/6 2:55:56 阅读更多 →
QooBot:全栈开源的仿生人操作系统——软硬一体,自由制造

QooBot:全栈开源的仿生人操作系统——软硬一体,自由制造

QooBot:全栈开源的仿生人操作系统——软硬一体,自由制造 摘要:QooBot 是一个面向仿生人的开源全栈生态,涵盖从机械图纸、电路设计到操作系统、AI 算法的完整技术栈。本文从架构全景、大脑核心、推理引擎、开发者生态等维度全面解读…

2026/7/6 2:53:55 阅读更多 →
可变级数LC无源自均压海量级联多电平拓扑机理研究——代替传统LCC/MMC的新一代特高压直流逆变架构

可变级数LC无源自均压海量级联多电平拓扑机理研究——代替传统LCC/MMC的新一代特高压直流逆变架构

可变级数LC无源自均压海量级联多电平拓扑机理研究——取代传统LCC/MMC的新一代特高压直流逆变架构 ----------作者:杨连江 摘要 针对我国特高压直流输电现有两大技术体系(LCC电网换相直流、MMC柔性直流)存在的底层机理缺陷,本文提…

2026/7/6 2:53:55 阅读更多 →
卡梅德生物技术快报| KM13 辅助噬菌体的天然 VHH 噬菌体文库全套构建流程与数据验证

卡梅德生物技术快报| KM13 辅助噬菌体的天然 VHH 噬菌体文库全套构建流程与数据验证

一、提出问题:实验室自建纳米抗体文库常遇四大工程化痛点 食品检测实验室自主构建 VHH 噬菌体文库时,普遍存在工程化落地难题:其一,普通单轮 PCR 扩增 VHH 基因存在大量缺失,文库多样性不足;其二&#xff…

2026/7/6 2:51:55 阅读更多 →
Variance Reduction with Baseline 补充 - 加基线使得方差降低

Variance Reduction with Baseline 补充 - 加基线使得方差降低

什么叫基线 基线就是一个只和当前状态s有关、和动作a无关的数值 b(s),用来做 “参考平均分”假设某状态s平均长期收益 b(s)10 某条轨迹 G_t18:A_t18-108>0,动作比平均更好,加大该动作概率 某条轨迹 G_t3:A_t3-10-7…

2026/7/6 2:51:55 阅读更多 →
MP1584 降压电源 PCB 布局 5 大要点:实测 SW 节点尖峰降低 60%

MP1584 降压电源 PCB 布局 5 大要点:实测 SW 节点尖峰降低 60%

MP1584降压电源PCB布局实战:5大核心技巧让SW节点尖峰直降60%作为一名长期奋战在电源设计一线的工程师,我深知PCB布局对开关电源性能的决定性影响。今天我们就以MP1584这款经典降压芯片为例,通过实测数据揭示那些手册上不会告诉你的布局奥秘。…

2026/7/6 2:49:55 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南:告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况:下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻