问题现象
在微服务架构中,我曾遇到一个棘手的问题。具体来说,在一个微服务项目的目录中,存在两个不同版本的JAR包,它们实现了相同的功能。其中一个版本的类文件上标注了@Component
注解,而另一个版本则没有。根据加载顺序,没有@Component
注解的JAR包排在前面。以下是相关截图:
按照常理,类加载机制应该只会识别并加载那些没有@Component
注解的类,如下所示:
然而,实际情况却是Spring框架基于没有注解的类创建了Bean,如下所示:
这引发了我的疑问:为什么Spring会为一个没有注解的类创建Bean?我的初步推断是,Spring并不是通过检查已加载类是否含有@Component
注解来决定是否创建Bean的。
源码剖析
在Spring框架中,扫描带有注解的Bean是通过ClassPathBeanDefinitionScanner#scanCandidateComponents()
方法实现的。该方法会根据配置的scanBasePackages
参数,从CLASSPATH下的所有JAR包中寻找符合指定包路径的类。以下是相关截图:
接着,Spring会读取这些Class文件的内容,并检查它们是否带有@Component
注解。如果存在该注解,Spring将为这些类创建相应的Bean。
相关文章
暂无评论...