SpringBoot 源码 ConfigurationClassPostProcessor 的疑问?

最近在看源码,版本是 SpringBoot 2.1.1

在 ConfigurationClassPostProcessor 的 postProcessBeanDefinitionRegistry() 方法里,判断该 beanPostProcessor 是否已经执行过,是通过获取了 hashcode 值,代码如下:

image.png

为啥不是通过 beanPostProcessor 的全类名来判断是否运行过呢?hashcode 有可能冲突,会不会发生,某个 beanPostProcessor 并没有执行,但是无法运行的情况呢?

阅读 1.9k
1 个回答

一开始不了解identityHashCode,搜索了下还挺有意思的:

  • 对于本问题全类名是针对类的,identityHashCode则对应于实例化对象,两个的范围并不一样,至于这个方法是否只针对类也可以则没有再深究。
  • identityHashCode确实会重复,用在这里严格来说确实会可能冲突,自己测试了下10w实例后会出现重复的,而且还挺多的,测试了几次都是10W之后才出现的,不知道内部什么机制。
  • 其它语言也有类似的函数,但他们很多都是在生命周期内是唯一的,一旦回收后会被其它对象复用。貌似java也可以通过在启动参数中设置-XX:hashCode=2或者是-XX:hashCode=4来关联内存产生,
  • -XX:hashCode=3则是自增,此时只要不超过整数最大值应该就不会重复,但是java之所以不用这个应该是效率考虑,目前默认的是最高效率的。

目前spring还有其它地方直接用的这个函数,可能是认为数量太小不会出现重复?更深的原理还望其它有经验的来解答。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题