ClassPathBeanDefinitionScanner详解

761 阅读1分钟

企业微信20210326-144234.png

上面是这个类的一个继承关系。

1、先看看他的作用是什么?

在类路径上进行扫描,并将符合条件的bean Definition注册到ApplicationContext中;
标注@Component@Repository@Service@Controller

2、核心实现

企业微信20210326-145633.png

企业微信20210326-150000.png

1、从给定路径下找到’candidate‘
2、介绍几个概念吧
    componentsIndex:组件索引的加载机制,和这个文件META-INF/spring.components有关,默认情况下没有配置,componentsIndex为null;
    includeFilters:默认会注册@Component、javax.annotation.ManagedBean、javax.inject.Named,会判断这些注解是否标注@Indexed

企业微信20210326-151926.png

1、第一步将com.lj.netty.controller路径解析为classpath*:com/lj/netty/controller/**/*.class2、通过PathMatchingResourcePatternResolver得到Resource数组;
3、通过CachingMetadataReaderFactoryResource解析为SimpleMetadataReader4、通过excludeFilters和includeFilters进行过滤;
5、将metadataReader包装为ScannedGenericBeanDefinition对象;
6、根据下面的条件再次进行过滤;

企业微信20210326-153607.png

7、最后将剩下的加入到candidates集合中;
8、遍历上面的集合,给bean设置scope和beanName;
9、如果类型为AbstractBeanDefinition,设置默认的beanDefinition;
10、如果类型为AnnotatedBeanDefinition,解析@Lazy@Primary@DependsOn@Role@Description等注解;
11、注册到beanDefinitionMap中,注册bean名称的别名(如果有的话)。

2、注册一些注解的后处理器

企业微信20210326-154947.png

企业微信20210326-155032.png

企业微信20210326-155049.png