当前位置: 首页 > news >正文

4、Spring手写系列-为Bean对象注入属性和依赖Bean的功能实现

一、前言

        在软件开发中,系统的健壮性和抗压能力是衡量程序优劣的重要指标。无论是高并发场景下的超卖问题,还是复杂业务逻辑中的幂等性,开发人员都需要具备处理这些问题的能力。而这些问题往往不是通过简单的CRUD操作就能解决的,它需要深厚的技术积累和良好的架构设计。对于初级程序员来说,可能会遇到代码丢三落四、乱码等问题,这不仅影响系统的稳定性,还可能带来隐患。在这种情况下,要想让你的程序“抗揍”,就必须提升自己的技术水平,理解并应用更高级的设计理念和模式。

在之前的章节中,我们实现了一个简化版的Spring Bean容器,支持Bean的注册和实例化。尽管我们已经支持了构造函数的Bean实例化,但还没有处理Bean的属性注入和依赖注入功能。这些功能对于一个完整的IoC容器来说是必不可少的。因此,本章节的目标是为Bean对象注入属性和依赖Bean的功能实现奠定基础。

二、目标

通过本章节的学习,你将学会:

  1. 为Bean对象注入属性。
  2. 实现Bean之间的依赖注入。
  3. 完成Bean对象的完整实例化过程,包括属性填充。

三、设计

在设计过程中,我们需要解决以下几个关键问题:

  1. 属性注入的时机:属性注入应该在Bean实例化之后进行。因此,我们需要在AbstractAutowireCapableBeanFactorycreateBean方法中添加一个补全属性的方法,即applyPropertyValues

  2. 属性值的表示:为了支持属性注入,我们需要在BeanDefinition中添加PropertyValuesPropertyValues是一个集合类,用于存储多个PropertyValuePropertyValue代表一个具体的属性,包含属性名和属性值。

  3. 依赖注入的处理:在属性注入的过程中,如果属性值是一个未实例化的Bean对象,需要递归地进行实例化和注入。这涉及到通过BeanReference来引用其他Bean,从而实现依赖注入。

1. UML类图

以下是实现这一功能的核心类和接口的结构图:

└── src├── main│   └── java│       └── cn.mxy.springframework.beans│           ├── factory│           │   ├── config│           │   │   ├── BeanDefinition.java       // Bean定义类,增加PropertyValues属性│           │   │   ├── BeanReference.java        // 用于表示Bean的引用│           │   │   └── SingletonBeanRegistry.java// 单例Bean注册表接口│           │   ├── support│           │   │   ├── AbstractAutowireCapableBeanFactory.java // 实现属性注入逻辑│           │   │   ├── AbstractBeanFactory.java  // BeanFactory抽象类│           │   │   ├── BeanDefinitionRegistry.java// Bean定义注册表│           │   │   ├── DefaultListableBeanFactory.java // 默认BeanFactory实现│     

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • ThreadLocal在多线程环境中的应用与原理解析
  • C / C++ const 全面总结
  • Python Chardet介绍
  • YOLO与PyQt5结合-增加论文工作量-实现一个目标检测的UI界面
  • 以“程序员”为主题的餐馆:编织代码与味蕾的奇妙邂逅
  • vue组件中的数据传递(2)--子组件传父组件
  • 带有WebUI的cron替代品Dagu
  • 【JavaScript】LeetCode:6-10
  • 【网络安全】服务基础第一阶段——第八节:Windows系统管理基础---- Web服务与虚拟主机
  • 软件单元测试工程模版化
  • 英伟达最新论文解析:剪枝与知识蒸馏 —— 可穿戴AI时代即将到来
  • HarmonyOS ArkUI工程框架解析
  • PHP软件下载-安装-环境配置
  • Unet改进15:添加TripletAttention||减少冗余计算和同时存储访问
  • 如何安装Docker
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • AWS实战 - 利用IAM对S3做访问控制
  • Javascript 原型链
  • JS变量作用域
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • JS专题之继承
  • Linux中的硬链接与软链接
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • 搭建gitbook 和 访问权限认证
  • 区块链共识机制优缺点对比都是什么
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • ​渐进式Web应用PWA的未来
  • # C++之functional库用法整理
  • # Spring Cloud Alibaba Nacos_配置中心与服务发现(四)
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • (Charles)如何抓取手机http的报文
  • (done) 两个矩阵 “相似” 是什么意思?
  • (ZT)薛涌:谈贫说富
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (十三)MipMap
  • (四)软件性能测试
  • (转载)Linux网络编程入门
  • **CI中自动类加载的用法总结
  • .net core 外观者设计模式 实现,多种支付选择
  • .NET Core中Emit的使用
  • .NET 表达式计算:Expression Evaluator
  • .NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke(转)
  • .net使用excel的cells对象没有value方法——学习.net的Excel工作表问题
  • @Slf4j idea标红Cannot resolve symbol ‘log‘
  • [ vulhub漏洞复现篇 ] AppWeb认证绕过漏洞(CVE-2018-8715)
  • [240903] Qwen2-VL: 更清晰地看世界 | Elasticsearch 再次拥抱开源!
  • [AX]AX2012 SSRS报表Drill through action
  • [C++] 模拟实现list(二)
  • [C++进阶篇]STL中vector的使用
  • [CDOJ 1343] 卿学姐失恋了
  • [CISCN2019 华东南赛区]Web4
  • [GDMEC-无人机遥感研究小组]无人机遥感小组-000-数据集制备
  • [GN] DP学习笔记板子