一次 Spring 扫描 @Component 注解修饰的类坑
问题现象
之前遇到过一个问题,在一个微服务的目录下有相同功能 jar 包的两个不同的版本,其中一个版本里面的类有 @Component 注解,另外一个版本的类里面没有 @Component 注解,且按照加载的顺序,没有 @Component 注解的 jar 包顺序还在前面,如下图所示:




按照类加载的顺序来说,只会加载没有 @Component 注解的类,如下图所示:

但是实际上发现 Spring 还是基于这个类创建了 Bean如下图所示:

为啥加载的类明明没有注解,但是 Spring 为什么还是创建了这个类的 Bean?初步猜测 Spring 不是通过读取已加载的类是否有 @Component 注解来判断是否要创建 Bean的。
源码剖析
Spring 中扫描注解修饰的 Bean 是在 ClassPathBeanDefinitionScanner#scanCandidateComponents() 方法里面实现的,这个方法里面会根据配置的 scanBasePackages 从 CLASSPATH 下所有的 jar 包里面去找符合这个包路径的类,如下图所示:



然后读取这些 Class 文件的内容,判断它们是否有 @Component 注解,如果有后续就会创建一个对应的 Bean。


一次 Spring 扫描 @Component 注解修饰的类坑的更多相关文章
- Spring Boot@Component注解下的类无法@Autowired的问题
title: Spring Boot@Component注解下的类无法@Autowired的问题 date: 2019-06-26 08:30:03 categories: Spring Boot t ...
- spring扫描自定义注解并进行操作
转载:http://blog.csdn.net/cuixuefeng1112/article/details/45331233 /** * 扫描注解添加服务到缓存以供判断时候为对外开放service ...
- Spring中@Component注解,@Controller注解详解
在使用Spring的过程中,为了避免大量使用Bean注入的Xml配置文件,我们会采用Spring提供的自动扫描注入的方式,只需要添加几行自动注入的的配置,便可以完成 Service层,Controll ...
- Spring中@Component注解,@Controller注解详解
在使用Spring的过程中,为了避免大量使用Bean注入的Xml配置文件,我们会采用Spring提供的自动扫描注入的方式,只需要添加几行自动注入的的配置,便可以完成 Service层,Controll ...
- spring学习笔记三:Component注解(把POJO类实例化到spring的IOC容器中)
Component注解:把普通的POJO 类实例化到spring的IOC容器中,就是定义成<bean id="" class=""> 项目目录树: ...
- 山寨一个Spring的@Component注解
1. 前言 我们在上一篇对Mybatis如何将Mapper接口注入Spring IoC进行了分析,有同学问胖哥这个有什么用,这个作用其实挺大的,比如让你实现一个类似@Controller的注解(或者继 ...
- spring中@Component注解
1.@controller 控制器(注入服务) 2.@service 业务(注入dao) 3.@repository dao(实现dao访问) 4.@component (把普通pojo实例化到spr ...
- 分析spring事务@Transactional注解在同一个类中的方法之间调用不生效的原因及解决方案
问题: 在Spring管理的项目中,方法A使用了Transactional注解,试图实现事务性.但当同一个class中的方法B调用方法A时,会发现方法A中的异常不再导致回滚,也即事务失效了. 当这个方 ...
- Spring AOP基于注解的“零配置”方式实现
为了在Spring中启动@AspectJ支持,需要在类加载路径下新增两个AspectJ库:aspectjweaver.jar和aspectjrt.jar.除此之外,Spring AOP还需要依赖一个a ...
- Spring全家桶注解一览(精选)
废话 最近想整理一波Spring注解相关的文章,虽然写CURD就只涉及到那些常用的注解.但是笔者我也想去了解一下其他注解,丰富下自己的知识面(提升一下逼格!). 就想在网上搜了半天,好像大家的都差不多 ...
随机推荐
- 标准库之 datetime和time 模块
一.time 模块 time模块是Python标准库中最基础.最常用的模块之一.它提供了各种处理时间的方法和函数,如获取当前时间.格式化时间.计算时间差等.time模块大部分函数的底层实现是 C 语言 ...
- iOS中NSBundle使用小结
bundle是一个目录,其中包含了程序会使用到的资源. 这些资源包含了如图像,声音,文本文件,属性列表,语言包,编译好的代码,nib文件(用户也会把bundle称为plug-in). 对应bundle ...
- 0201 为什么 Pytorch 定义模型要有一个 init 和一个 forward,两者怎么区分
https://www.bilibili.com/video/BV1GB4y1H7hq?spm_id_from=333.999.0.0&vd_source=b1ce52b6eb3a9e6c23 ...
- 云原生周刊:CNCF 宣布 Cilium 毕业 | 2023.10.16
开源项目推荐 Reloader Reloader 是一个 Kubernetes 控制器,用于监控 ConfigMap 和 Secrets 中的变化,并对 Pod 及其相关部署.StatefulSet. ...
- 在 K8s 中快速部署使用 GitLab 并构建 DevOps 项目
作者:张海立,KubeSphere 社区 Ambassador.Talented Speaker,社区用户委员会上海站副站长 原文链接:https://kubesphere.com.cn/blogs/ ...
- [快速阅读八] Matlab中bwlookup的实现及其在计算二值图像的欧拉数、面积及其他morph变形中的应用。
以前看过matlab的bwlookup函数,但是总感觉有点神秘,一直没有去仔细分析,最近在分析计算二值图像的欧拉数时,发现自己写的代码和matlab的总是对不少,于是又去翻了下matlab的源代码,看 ...
- H5移动端字体自适应(也适用于宽高)
原文地址: https://mp.weixin.qq.com/s/hhmav2sbAgb7w17ipVZiTw 方法一:纯css方法, 精确度高,IOS 和 安卓 字体大小同等比例1.1 以16px为 ...
- TrueNAS关闭5357端口
sockstat -4l 查看监听5357端口进程的ID. 用kill -9 PID 干掉进程.
- 开源 PHP 商城项目 CRMEB 安装和使用教程
说到电商系统,很多人第一反应可能是 Shopify 或 Magento.没错,这些平台确实功能强大,但是...它们也太强大了,不仅复杂还昂贵,对于刚起步的创业者来说简直是压力山大. 但是从零开始开发一 ...
- SqlSugarClient 代码优先建表, 根据给定的实体类,创建SQL语句, 之后创建MySQL表
using SqlSugar; using System; using System.Collections.Generic; using System.Reflection; using Syste ...