Spring扫描底层流程
2022-10-14 09:18:31 0 举报
Spring扫描类成BeanDefinition流程
作者其他创作
大纲/内容
如果当前类与includeFilters匹配,通过校验
isCandidateComponent(metadataReader)
包路径ClassPathBeanDefinitionScanner#doScan
在new ClassPathBeanDefinitionScanner(this);时往includeFilters添加Component
调用AnnotationBeanNameGenerator的generateBeanName生成beanName
isCandidateComponent(sbd)
findCandidateComponents(basePackage);
首先获取获取注解所指定的beanName没有再去拿默认名字Introspector.decapitalize(shortClassName);
解析@Lazy、@Primary、@DependsOn、@Role、@Description
否
解析成元数据
excludeFilters、includeFilters判断
mybatis这里会重写,使得mapper接口可以扫描成beanDefinition
检查Spring容器中是否已经存在该beanName
进一步进行条件注解@Conditional的匹配筛选
获取所有包路径下所有class文件对象
MetadataReader metadataReader = getMetadataReaderFactory().getMetadataReader(resource);
生成一个ScannedGenericBeanDefinition
如果是抽象类。但是有@Lookup的方法通过
AnnotationConfigUtils.processCommonDefinitionAnnotations((AnnotatedBeanDefinition) candidate);
如果不是顶级类,或者静态内部类,否则不通过
是否兼容,如果兼容返回false表示不会重新注册到Spring容器中,如果不冲突则会抛异常。
checkCandidate
放入容器中
判断是否能创建bean
如果是接口或者抽象,则不通过
最终扫描到某些BeanDefinition
都匹配成功
给BeanDefinition属性赋值
如果当前类与exludeFilters匹配,就排除这个类
遍历BeanDefinition
这里只是把className设置到BeanDefinition中 1.一开始是赋值类的名字
0 条评论
下一页
为你推荐
查看更多