谁让你创建两个对象的?

问题现象

在微服务架构中,我曾遇到一个棘手的问题。具体来说,在一个微服务项目的目录中,存在两个不同版本的JAR包,它们实现了相同的功能。其中一个版本的类文件上标注了@Component注解,而另一个版本则没有。根据加载顺序,没有@Component注解的JAR包排在前面。以下是相关截图:
image.png
image.png
image.png
image.png

按照常理,类加载机制应该只会识别并加载那些没有@Component注解的类,如下所示:
image.png

然而,实际情况却是Spring框架基于没有注解的类创建了Bean,如下所示:
image.png

这引发了我的疑问:为什么Spring会为一个没有注解的类创建Bean?我的初步推断是,Spring并不是通过检查已加载类是否含有@Component注解来决定是否创建Bean的。

源码剖析

在Spring框架中,扫描带有注解的Bean是通过ClassPathBeanDefinitionScanner#scanCandidateComponents()方法实现的。该方法会根据配置的scanBasePackages参数,从CLASSPATH下的所有JAR包中寻找符合指定包路径的类。以下是相关截图:
image.png
image.png
image.png
接着,Spring会读取这些Class文件的内容,并检查它们是否带有@Component注解。如果存在该注解,Spring将为这些类创建相应的Bean。
image.png
image.png

版权声明:程序员胖胖胖虎阿 发表于 2024年12月27日 下午6:10。
转载请注明:谁让你创建两个对象的? | 胖虎的工具箱-编程导航

相关文章

暂无评论

暂无评论...