背景
前面查问题看到了ApplicationListenerDetector的注释,说明是为了不可靠getBeansOfType做的冗余
所以这里又专门去看了为什么
1、当然是注释直接写的
人家就是这么设计的,咋办?
2、搜集信息发现了bug场景
如果bean1存在别名时,别名和另一个bean2名字相同,会导致bean2永远无法通过getBeanOfType获取到。
且通过名称也总是获取到bean1.
原因
遍历BD寻找符合Type的beanName时,会直接跳过别名name
第2点的总结
- 根本上,是Spring没有将异常前置,导致使用时才出现异常排查。
- 应当在启动流程中,判断到存在别名和名称冲突就直接抛出异常失败启动,就和beanName冲突一样
从这个事情上总结
- 规范必须执行,比如代码审计提前暴露问题;
- 规范上要求不得别名重名,当然能改掉源码逻辑硬性禁止重名最好。