Spring容器构造器初始化之扫描逻辑
2022-10-04 21:24:23 4 举报
yyy
作者其他创作
大纲/内容
Spring 提供api用来动态扫描注解
AnnotationConfigApplicationContext()调用构造方法this()
this.scanner = new ClassPathBeanDefinitionScanner();
去创建一个ScannedGenericBeanDefinition
遍历basePackages
findCandidateComponents(basePackage)
ClassPathScanningCandidateComponentProviderregisterDefaultFilters()将Component注解添加到一个includeFilters集合中this.includeFilters.add(new AnnotationTypeFilter(Component.class));
context.scan
match
doScan(String...basePackage)
根据包名去拼接一个urlclasspath*:\"+com/xxx/yyy/zzz+'/'+**/*.class
接着遍历每一个Resource
scanner.scan(basePackages)
判断是不是候选ComponentsisCandidateComponent(metadataReader)
scanCandidateComponents(basePackage)
ClassPathBeanDefinitionScanner调用registerDefaultFilters()
add
\tResource[] resources=在据拼接的路径得到该包下所有类所对应的Resource
使用sacnner对象调用scan()
寻找候选Components
将该bd放到一个Set集合中去
调用
什么时候返回true or false 呢 (这个判断非常重要==扫描的主要逻辑就在这完成的) 比如在指定包下有某个普通的类【上面没有加@Components】 怎么去判断是不是候选Components呢?Spring中的判断逻辑是==判断遍历到的每一个类属不属于我们一个集合中的一些指定元素,这个集合叫List<TypeFilter> excludeFilters 如果不在则返回false 如果在则返回true 那么这个集合是在什么时候被放入元素的呢?此时在回到初始化中this()里面对scaner的创建
includeFilters
容器
scaner对象初始化
经过匹配判断某些类符合我们规则,也即表明该类上是加了@Components。
什么叫候选Components?候选:顾名思义就是从一堆东西中,根据某个规则,选取一个或者多个,那对于Spring扫描来说 这个规则就是这个类上有没有添加@Components注解,如果找到了符合这个规则的类,那么就将其添加到一个Map中去
那么该如何筛选
将遍历得到的Resource作为参数获取类的元数据MetadataReader比如在这个MetadataReader中有关于类的名字、类是不是抽象、类的加载器等信息
this.includeFilters.add(new AnnotationTypeFilter(Component.class));
0 条评论
回复 删除
下一页