最近在看源码,版本是 SpringBoot 2.1.1
在 ConfigurationClassPostProcessor 的 postProcessBeanDefinitionRegistry() 方法里,判断该 beanPostProcessor 是否已经执行过,是通过获取了 hashcode 值,代码如下:
为啥不是通过 beanPostProcessor 的全类名来判断是否运行过呢?hashcode 有可能冲突,会不会发生,某个 beanPostProcessor 并没有执行,但是无法运行的情况呢?
一开始不了解
identityHashCode
,搜索了下还挺有意思的:全类名
是针对类的,identityHashCode
则对应于实例化对象,两个的范围并不一样,至于这个方法是否只针对类也可以则没有再深究。identityHashCode
确实会重复,用在这里严格来说确实会可能冲突,自己测试了下10w实例后会出现重复的,而且还挺多的,测试了几次都是10W之后才出现的,不知道内部什么机制。-XX:hashCode=2
或者是-XX:hashCode=4
来关联内存产生,-XX:hashCode=3
则是自增,此时只要不超过整数最大值应该就不会重复,但是java之所以不用这个应该是效率考虑,目前默认的是最高效率的。目前spring还有其它地方直接用的这个函数,可能是认为数量太小不会出现重复?更深的原理还望其它有经验的来解答。