舒服,给Spring贡献一波源码。 (中)

简介: 舒服,给Spring贡献一波源码。 (中)

也就是 4 行代码,其实应该是 2 行核心代码,就完成了让 @Async 支持表达式的这个需求。

而且官方是先给你说了解决方案是什么,只要你稍微你跟进一下,发动你的小脑壳思考一下,我想你写出这 4 行代码也不是什么困难的事情。

这就是给 Spring 贡献源码了,而且是一个比较有价值的贡献。如果是你抓住了这个机会,你完全可以在简历上写一句:给 Spring 贡献过源码,让 @Async 注解支持表达式的配置方式。

一般来说对 Spring 了解不深入的朋友,看到这句话的时候,只会觉得很牛逼,想着应该是个大佬。

但是实际上,2 行核心代码就搞定了。

所以你说给 Spring 贡献源码这个事儿难吗?

机会总是有的,就看你有没有上心了。

什么,你问我有没有给 Spring 贡献过源码?

我没有,我就是不上心,咋的了。

这是我写这个文章想要表达的第个观点:

给开源项目贡献源码其实不是一件特别困难的事情,不要老想着一次就提交一整个功能上去。一点点改进,都是好的。



调试技巧


前面提到的代码改进, Spring 还没有发布官方的包,但是我想要自己试验一下,怎么办呢?

你当然可以把 Spring 的源码拉下来,然后自己编译一波,最后本地改改源码试一试。

但是这个过程太过复杂了,基本上可以说是一个劝退的流程。

为了这么一个小验证,完全不值当。

所以我教你一个我自己研究出来的“骚”操作。

首先,我本地的 Spring 版本是 5.3.16,对应这部分的源码是这样的:

image.png

image.png

这个时候我们可以看到 qualifier 还是一个表达式的形式。

接着骚操作就来了。

你点击这个图标,对应的快捷键是 Alt+F8:

image.png

image.png

image.png

image.png

那么,如果我把这次提交的这 4 行代码,利用 Evaluate Expression 功能执行一下,是不是就算是模拟了对应的修改后的功能了?

我就问你:这个方法“骚”不“骚”。

接下来,我们就实操起来。

把这几行代码,填入到 Evaluate 里面:

if (beanFactory instanceof ConfigurableBeanFactory) {
 EmbeddedValueResolver embeddedValueResolver = new EmbeddedValueResolver((ConfigurableBeanFactory)beanFactory);
 qualifier = embeddedValueResolver.resolveStringValue(qualifier);
}

输入代码片段,记得点击一下这个图标:

image.png

image.png

说明我的“偷梁换柱”大法成功了。

这不比你去编译一份 Spring 源代码来的方便的多?

而且这个调试的方法,相当于是你在 debug 的时候还能再额外执行一些代码,所以有的时候真的有时候能起到奇效。

image.png

这是我写这篇文章的第二个目的,想要分享给你这个调试方法。


不同之处


细心的读者肯定发现了,官方的代码有点奇怪啊:

image.png

我们常用的写法都是标号为 ① 那样的,当我在我的环境里面写出标号为 ② 的代码的时候,ide 给我了一个提示:

image.png

Patterns in 'instanceof' are not supported at language level '8'

大概意思是说 instanceof 的这个用法在 JDK 8 里面是不支持的。

看到这个提示的一瞬间,我突然想起了,这个写法好像是 JDK 某个高级版本之后支持的,很久之前在某个地方瞟到过一眼。

然后我用 “Patterns instanceof” 关键词查了一下,发现果然是 JDK 14 版本之后支持的一个新特性。

https://www.baeldung.com/java-pattern-matching-instanceof


image.png

我就直接把文章中的例子拿出来给你说一下。

我们用 instanceof 的时候,基本上都是需要检查对象的类型的场景,不同的类型对应不同的逻辑。

好,我问你,你使用 instanceof,在类型匹配上了之后,你的下一步操作是什么?

是不是对对象进行强制类型转换?

比如这样的:

image.png

在上述代码截图中,我们每种情况要通过 instanceof 判断 animal 的具体类型,然后强制类型转换声明为局部变量,接着根据具体的类型执行指定的函数。

这有的写法有很多缺点:

  • 这么写非常单调乏味,需要检测类型然后强制类型转换。
  • 每个 if 都要出现三次类型名。
  • 类型转换和变量声明可读性很差
  • 重复声明类型名意味着很容易出错,可能导致未预料到的运行时错误。
  • 每新增一个animal 类型就要修改这里的函数。

注意我加粗的地方,和原文是一样的,这波强调和细节是拉满了的:

image.png

目录
相关文章
|
1月前
|
XML 缓存 Java
Spring源码之 Bean 的循环依赖
循环依赖是 Spring 中经典问题之一,那么到底什么是循环依赖?简单说就是对象之间相互引用, 如下图所示: 代码层面上很好理解,在 bean 创建过程中 class A 和 class B 又经历了怎样的过程呢? 可以看出形成了一个闭环,如果想解决这个问题,那么在属性填充时要保证不二次创建 A对象 的步骤,也就是必须保证从容器中能够直接获取到 B。 一、复现循环依赖问题 Spring 中默认允许循环依赖的存在,但在 Spring Boot 2.6.x 版本开始默认禁用了循环依赖 1. 基于xml复现循环依赖 定义实体 Bean java复制代码public class A {
|
2月前
|
监控 数据可视化 关系型数据库
微服务架构+Java+Spring Cloud +UniApp +MySql智慧工地系统源码
项目管理:项目名称、施工单位名称、项目地址、项目地址、总造价、总面积、施工准可证、开工日期、计划竣工日期、项目状态等。
307 6
|
2月前
|
Java 关系型数据库 数据库连接
Spring源码解析--深入Spring事务原理
本文将带领大家领略Spring事务的风采,Spring事务是我们在日常开发中经常会遇到的,也是各种大小面试中的高频题,希望通过本文,能让大家对Spring事务有个深入的了解,无论开发还是面试,都不会让Spring事务成为拦路虎。
35 1
|
1月前
|
Java 测试技术 数据库连接
【Spring源码解读!底层原理高级进阶】【下】探寻Spring内部:BeanFactory和ApplicationContext实现原理揭秘✨
【Spring源码解读!底层原理高级进阶】【下】探寻Spring内部:BeanFactory和ApplicationContext实现原理揭秘✨
|
5天前
|
Java 关系型数据库 MySQL
一套java+ spring boot与vue+ mysql技术开发的UWB高精度工厂人员定位全套系统源码有应用案例
UWB (ULTRA WIDE BAND, UWB) 技术是一种无线载波通讯技术,它不采用正弦载波,而是利用纳秒级的非正弦波窄脉冲传输数据,因此其所占的频谱范围很宽。一套UWB精确定位系统,最高定位精度可达10cm,具有高精度,高动态,高容量,低功耗的应用。
一套java+ spring boot与vue+ mysql技术开发的UWB高精度工厂人员定位全套系统源码有应用案例
|
1月前
|
Java Spring
使用spring实现邮件的发送(含测试,源码,注释)
使用spring实现邮件的发送(含测试,源码,注释)
7 0
|
1月前
|
Java Spring 容器
【Spring源码】单例创建期间进行同步可能会导致死锁?
通过这个标题我们就可以思考本次的阅读线索了,看起来可以学到不少东西。1. 旧代码的死锁是怎么产生的。2. 贡献者通过改变什么来解决本次PR的问题呢?而阅读线索2的答案也显而易见,就是上文提到的通过后台线程来创建Micrometer单例...
41 3
|
1月前
|
XML Java 开发者
【Spring源码解读 底层原理高级进阶】【上】探寻Spring内部:BeanFactory和ApplicationContext实现原理讲解
【Spring源码解读 底层原理高级进阶】【上】探寻Spring内部:BeanFactory和ApplicationContext实现原理讲解
|
2月前
|
NoSQL Java Redis
【Spring Boot 源码学习】JedisConnectionConfiguration 详解
本篇 Huazie 带大家从源码分析 JedisConnectionConfiguration 配置类
123 6
【Spring Boot 源码学习】JedisConnectionConfiguration 详解
|
2月前
|
NoSQL Java Redis
【Spring Boot 源码学习】RedisAutoConfiguration 详解
本篇 Huazie 带大家一起从源码深入了解 RedisAutoConfiguration 配置类
57 2
【Spring Boot 源码学习】RedisAutoConfiguration 详解