【JAVA/SPRING】getBeansOfType小坑

53 阅读1分钟

背景

前面查问题看到了ApplicationListenerDetector的注释,说明是为了不可靠getBeansOfType做的冗余

所以这里又专门去看了为什么

image.png

1、当然是注释直接写的

人家就是这么设计的,咋办?

image.png

2、搜集信息发现了bug场景

如果bean1存在别名时,别名和另一个bean2名字相同,会导致bean2永远无法通过getBeanOfType获取到。

且通过名称也总是获取到bean1.

原因

遍历BD寻找符合Type的beanName时,会直接跳过别名name

image.png

image.png

第2点的总结
  • 根本上,是Spring没有将异常前置,导致使用时才出现异常排查。
  • 应当在启动流程中,判断到存在别名和名称冲突就直接抛出异常失败启动,就和beanName冲突一样

从这个事情上总结

  • 规范必须执行,比如代码审计提前暴露问题;
  • 规范上要求不得别名重名,当然能改掉源码逻辑硬性禁止重名最好。