Spring注解模式的相关源码解析
- 基于注解实现的bean注册,要完成的目标
1.1.能够扫描指定包下的类
1.2 基于扫描的类生成定义的bean定义 - 了解spring是如何描述一个类的信息的
- 开始注解的扫描及注册源码的解析
由持有的ClasspathBeandefinitionScan开始扫描
3.1 这里主要实现由包名到资源的过程
3.1.1 我们只有包名,需要把它转换成我们需要的资源类型
PathMatchingResourcePatternResolver这个开始执行扫描的工作,返回资源类型
这里使用的是递归的方式,从最开始的路劲开始执行查找类的工作
3.2.2 到达这里,我们已经有了统一的资源类型,开始执行解析的工作
从这里看,首先基于资源得到了一个元数据(包含这类的基本信息,类的注解信息),那它是如何得到的呢,这里使用了一个缓存工厂
开始执行创建把对应的source转换成类,在从类的信息里面读取到元数据,这里使用了asm来执行元数据的读取操作,asm是直接对二进制进行操作,而使用反射读取,需要把类加载进jvm中,而有些类暂时不会使用,这样会带来jvm的性能损耗
到达了这里,就获取到了类的元数据信息,接下来,判断这个类的注解信息是否包括在定义的过滤器中
包含这Component。
在这里可以有扩展的地方,我们可以自己写一个接口,只要元数据包含Component。
二我们可以实现TypeFilter接口,使用自己的逻辑进行元数据的比较,判断那些类需要被加载
这里有个疑惑,这个注解是如何工作的
通过源码分析,在进行初次扫描后,会进行一次刷新操作,会对相应的注解进行特殊处理。重新进行包扫描
到这就完成了从包到资源,在从资源到元数据,在从元数据进行注解过滤,接下来就要开始
完成元数据的解析,组装bean定义
在发现是注解的方式时,对如下的一些注解进行一些参数的设置
到达了这里,我们也就得到了bean定义,开始执行注册的操作,达到了这里,我们也就完成了包名到资源,资源到元数据,元数据到bean定义,bean定义在注册到的这些步骤。