Spring源码阅读过程中基础知识补齐

1. isAssignableFrom

isAssignableFromClass类下的一个native方法,用来判断某个类是否和参数中的类是同一个类或者他的父类、父接口。为了更好地了解他的使用,我们来看一看一个和他用法有些相似的instanceof。我当时看的时候一个朴素的想法就是,为啥不用instanceof。下面通过表格的一个形式展示两者之间一些区别

instanceofisAssignableFrom
是个啥运算符Class类的方法
谁来用对象实例Class对象
用处判断对象是某个类的实例该类能否接受参数那个类的赋值
方向子->父父->子

可以看出,主要的区别在于,instanceof是给对象实例用的,用来保证能进行安全的类型转换。而isAssignableFrom更适合只有一些类信息的情况下使用,尤其是在Spring这种框架中,用来确认某个代理对象是否是我要的类型。

举个🌰

Java
复制代码
Class<?> parentClass = List.class; Class<?> childClass = ArrayList.class; Class<?> unrelatedClass = String.class; // 判断 ArrayList 是否可以赋值给 List boolean result1 = parentClass.isAssignableFrom(childClass); // true // 判断 String 是否可以赋值给 List boolean result2 = parentClass.isAssignableFrom(unrelatedClass); // false

2. MultiValueMap

顾名思义,是一个可以一个key映射多个value的Map。在Spring处理请求头的时候用到 位于org.springframework.util包下,下面是接口定义

Java
复制代码
public interface MultiValueMap<K, V> extends Map<K, List<V>>

可以看出他就是一个Map,那么他是怎么做到一个key映射多个Value的呢?于是我们找来了一个实现类

Java
复制代码
public class LinkedMultiValueMap<K, V> extends MultiValueMapAdapter<K, V> // new public base class in 5.3 implements Serializable, Cloneable

以下类图展示两者之间关系

image.png 我们可以通过MultiValueMapAdapter的一些方法发现其实就是通过一个List将多个Value存储起来让一个key映射多个Value

Java
复制代码
public class MultiValueMapAdapter<K, V> implements MultiValueMap<K, V>, Serializable { private final Map<K, List<V>> targetMap; @Override public void add(K key, @Nullable V value) { List<V> values = this.targetMap.computeIfAbsent(key, k -> new ArrayList<>(1)); values.add(value); }

希望各位大佬来补充和指正

0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
谈理想
作者分享
我服啦,老板半个月(算上测试一起)要上一个小程序,十二个模块加后台。要im,要站内信,还有好多个第三方服务。之前开会的时候还说他去了解过敏捷开发,我寻思他只看了名字吧,这也太敏捷了🤣
2
今天又发现ai一个好久之前产出的Bug,而且还有点难注意到。业务是这样的,一个商城的场景,编辑某个商品,对于多规格的商品,目前采用先删除原有的规格名和规格值,并插入新的。但是测试的时候出错了。排查日志发现是根据规格名id查询规格值的时候使用了in,但是没传入任何规格名的id,sql执行出错,向上翻日志发现查询发现是没查到对应的规格名记录(即图中queryByProductId方法),ps关于是否会有规格名在上面有严格校验。于是我去数据库里看了一下,是有数据的,而且用日志中一样的sql,也能直接查到,写了个测试类也能查到,但是接口中就是查不到。谁能想到,ai写的时候先逻辑删除了这条数据,然后紧接着去查了这条数据,当然查不到了😑
2
最近我的GLM Lite订阅马上要过期了,我在纠结到底是续期还是换MiniMax starter。先说一下我的状态吧,目前主要是配合Claude Code在日常工作中处理一些不太复杂的编码任务,目前来说,GLM能满足我的需求,但是最近智谱出了挺多问题的,我偶尔请求的时候会提示什么速率限制(按照官网的描述,订阅套餐是没有请求速率限制的)我也在群里问了,但是他们的回复很慢,甚至都不回复,这也是我有想要换订阅的一个理由吧,虽然我平时没什么问题需要解决,但我还是希望在我有问题的时候有人能给我一个回复。而且高峰期是真的挺慢的。因此我想问一下,MiniMax的使用体验怎么样,有没有人能解答一下的,而且starter的真的很便宜,比GLM Lite按年订阅单月价格还低,不过我看他们的速度应该是相当于GLM高峰期的速度,不过如果其他体验相当加上这个价格我觉得也不是不可以尝试,毕竟一个月而已,不行再换呗😂
2
if (CollectionUtils.isEmpty(userShops)) { ValidationUtils.isTrue(false, "用户未关联门店"); } 这是今天看到的AI生成的代码,有点好笑,给大家分享一下
7
关于云图库项目knife4j依赖引入导致启动失败解决方案
4
下载 APP