spring源码-代码的特殊写法

news/2025/2/12 18:14:18/

spring源码-代码的特殊写法

前言
在阅读spring源码中,可能会有很多种代码写法在工作中都没遇见过,阅读起来有一定的难度,在本文中,我会把我认为有难度的代码写法拿出来,并举例子说明清楚,方便大家阅读并理解源码
注意
本文只解析各种代码写法,详细源码分析可以阅读我的其他文章。

一、doGetBean

1.1 doGetBean方法

org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#getSingleton(java.lang.String, org.springframework.beans.factory.ObjectFactory<?>)
在这里插入图片描述

在这个Lambda表达式中,是将createBean(beanName, mbd, args) 返回的值作为 getSingleton(String beanName, ObjectFactory<?> singletonFactory) 的第二个参数传递过去了

1.2 进入getSingleton方法

当代码用到第二个参数ObjectFactory<?> singletonFactory的时候,也就是singletonFactory.getObject()的时候,程序会回到1.1的代码中执行createBean(beanName, mbd, args),等获取到值之后,会返回当前这个方法来,继续执行,等执行完了后会返回1.1的代码中,结束这个Lambda表达式。
在这里插入图片描述

1.3 举个例子

1.3.1 代码

大家可以结合时序图来分析这段代码
ObjectFactory

public interface ObjectFactory<T> {T getObject();
}

DefaultSingletonBeanRegistry

public class DefaultSingletonBeanRegistry {public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) {System.out.println(singletonFactory.getObject().toString());return 2;}
}

ABeanFactory

public class ABeanFactory extends DefaultSingletonBeanRegistry{protected <T> T doGetBean(){String beanName = "user";Object obj = getSingleton(beanName, ()->{return "1";});System.out.println(obj.toString());return null;}public static void main(String[] args) {ABeanFactory a = new ABeanFactory();a.doGetBean();}
}

1.3.2 打印结果

1
2

1.3.3 时序图

在这里插入图片描述


http://www.ppmy.cn/news/330963.html

相关文章

windows系统cmd命令设置别名,并添加到环境变量

众所周知&#xff0c;Linux 命令很强大&#xff0c;使用起来也很方便&#xff0c;但是想在 windows 系统上使用 Linux 命令有些困难&#xff0c;要么下载第三方终端工具&#xff0c;要么就是安装一系列命令环境。 作为一个前端开发&#xff0c;其实可以全局安装一下 npm 命令行…

存储技术3 数据保护: RAID

Why RAID 性能限制了磁盘驱动单独的驱动存在预期的使用寿命 MTBF测量若一个驱动器的MTBF是750 000小时&#xff0c; 阵列中有100个驱动&#xff0c; 阵列的MTBF会变成 750000 / 100 7500小时 RAID用于减缓这个问题RAID特点 增大容量高可用性增强的性能 RAID implementation…

JVM原理:JVM垃圾回收算法(通俗易懂)

目录 前言正文垃圾标记算法引用类型强引用软引用弱引用虚引用 引用计数法循环引用问题 根可达性分析法虚拟机栈&#xff08;栈帧的局部变量表&#xff09;中的引用方法区中类静态属性引用方法区中常量引用本地方法栈&#xff08;Native方法&#xff09;引用 垃圾回收算法标记清…

第七章 Linux实际操作——组管理和权限管理

第七章 Linux实际操作——组管理和权限管理 7.1 Linux组基本介绍7.2 文件、目录 所有者7.2.1 查看文件的所有者7.2.2 修改文件所有者 7.3 组的创建7.3.1 基本指令7.3.2 应用实例 7.4 文件、目录所在组7.4.1 查看文件、目录所在组7.4.2 修改文件、目录所在组 7.5 其他组7.6 权限…

预处理器的作用

面试题:预处理器标识#error的目的是什么? 答:#error命令是C/C++语言的预处理命令之一,当预处理器预处理到#error命令时将停止编译并输出用户自定义的错误消息。 其实大部分以#开头的宏定义都是预处理器,不仅仅有#error,还有常见的#include,#ifdef...#else...#endif。有可…

杭州互联网医疗Java实习一面

目录 1.java集合知道哪些2.ArrayList和LinkedList插入效率对比3.HashMap的底层结构4.HashMap怎么实现线程安全4.介绍下reentrantlock5.Redis分布式锁的实现原理7.知道哪些排序算法8.快排的原理9.Spring的AOP作用和原理10.MySQL的InnoDB索引结构11.网络中TCP和UDP的区别12.JVM的…

64位处理器_32位和64位的Windows 10和处理器(CPU)有什么区别

当你下载Windows 10、Office或任何其他软件时&#xff0c;可能会注意到有32位和64位版本可用&#xff0c;这时你可能会想到一个问题&#xff0c;我需要哪个&#xff1f; 在本文中&#xff0c;你可以了解32位和64位Windows 10之间的区别&#xff0c;以及哪种适合你。 本文目录 3…

麒麟810处理器_华为nova5跑分公布,麒麟810到底是什么水平?

华为nova5系列之后&#xff0c;受到关注的除了聚焦在本身的配置和设计外&#xff0c;还有一同推出的麒麟810处理器。作为华为第二款7nm处理器&#xff0c;华为的麒麟810和高通的骁龙7系列比较的话&#xff0c;结果会怎样&#xff1f;这也是不少用户的疑惑。 最近&#xff0c;安…