bean的扫描
2023-02-25 17:57:02 6 举报
bean的扫描
作者其他创作
大纲/内容
ClassPathBeanDefinitionScanner#scan
类不是接口或抽象类
扫描basePackage下所有的文件资源,获得Resource数组,遍历数组
符合@Condition
AnnotationBeanNameGenerator#generateBeanName
解析@Lazy、@Primary、@DependsOn、@Role、@Description注解,将值设置到BeanDefinition中
如果是同一个类,跳过。如果不是,报错
检查容器中是否已经存在该beanName
遍历ScannedGenericBeanDefinition集合
判断类是顶级类或静态内部类
否
返回本次扫描增加的BeanDefinition数量
遍历结束
是抽象类但方法上有@Lookup注解
注册到容器中
解析Scope注解,将值设置到BeanDefinition
Scanner父类ClassPathScanningCandidateComponentProvider#scanCandidateComponents
获取注解所指定的beanName
doScan(basePackages)
符合includeFilters(默认@Component)
返回BeanDefinition集合
没有指定,生成默认beanName,首字母小写
BeanDefinitionReaderUtils#registerBeanDefinition
是
使用ASM技术根据resource获取类元数据
不在excludeFilters(默认配置类) 范围
如果类名前两位都是大写直接返回类名
判断是否有别名,如果有,判断别名是否循环,是报错。否将别名注册到 aliasMap 中
ClassPathBeanDefinitionScanner#doScan
找到候选BeanDefinition集合
有@Component注解且value属性不为空
把BeanDefinition放入beanDefinitionMap中
遍历basePackages
加入候选BeanDefinition集合
生成ScannedGenericBeanDefinition设置className、source属性
获取beanName
0 条评论
回复 删除
下一页