老生谈spring(资深小白谈spring(十三):doScan的扫描原理
1、上一节讲了filter过滤器,这节带大家了解doScan的扫描原理:
2、在doScan方法中,扫描的主要逻辑就在findCandidateComponents方法中,如果没有特殊配置,findCandidateComponents方法主要是调scanCandidateComponents方法进行扫描。
3、遍历路径的代码只是个for循环就不看了,我们主要看的还是过滤器怎么进行过滤的。
4、从代码就可以看到,使用match方法进行匹配,exclude匹配的返回false而include匹配的则判断是否含有condiction注解,没有的直接返回true。
5、先来看spring默认的过滤器AnnotationTypeFilter的match方法,这个方法由父类AbstractTypeHierarchyTraversingFilter给出实现。代码虽然有些长,但匹配逻辑无非就是先匹配自己matchSelf,匹配不上就根据类名匹配matchClassName,再匹配不上则匹配父类,最后匹配接口matchInterface。
@Override
public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory)
throws IOException {
if (matchSelf(metadataReader)) {
return true;
}
ClassMetadata metadata = metadataReader.getClassMetadata