标签:candidate definitionHolder beanName 扫描 bean BeanDefinition
执行流程
- 根据classpath:* + 包名获取所有.class文件
- 遍历Resouce资源文件。
- 判断当前resouce文件所指的类是否拥有component注解,也就是判断该bean是否要扫描到spring容器中。
- 构建beanDefiniation,并将资源和类全限定包名设置上去。
- 在上一步仅仅是构造了BeanDefiniation并将bean全限定名称设置上去,但是类是否为单例、是否懒加载等等还没有设置,所以接下来要设置其余BeanDefiniation。
- 遍历BeanDefinitionList,并设置scope。
- 获取并设置beanName。
- 设置beanDefiniation默认值。
- 解析 @Lazy、@DependsOn、@Role和@Description注解
- 检查bean是否注册过,如果没注册过则对bean进行注册。
AnnotationConfigApplicationContext
首先AnnotationConfigApplicationContext
新建了两个对象,分别是BeanDefinition
读取器和扫描器,Bean是由扫描器来进行扫描的,先从这个类看起,spring是怎样完成扫描操作的。
包扫描
在ClassPathBeanDefinitionScanner
中有个scan
方法用于进行包扫描的,在这个方法中有个doScan
方法用于完成扫描逻辑,进入这个方法看一下。
主要注释已经写完了,通过扫描将beanDefinitions
进行返回
protected Set<BeanDefinitionHolder> doScan(String... basePackages) {
Assert.notEmpty(basePackages, "At least one base package must be specified");
Set<BeanDefinitionHolder> beanDefinitions = new LinkedHashSet<>();
for (String basePackage : basePackages) {
// 获取BeanDefinition,这里仅仅是将类名称获取到,是否单例 是否懒加载之类的参数还未获取,以下for循环就是获取这些参数的
Set<BeanDefinition> candidates = findCandidateComponents(basePackage);
for (BeanDefinition candidate : candidates) {
// 获取scope数据信息
ScopeMetadata scopeMetadata = this.scopeMetadataResolver.resolveScopeMetadata(candidate);
candidate.setScope(scopeMetadata.getScopeName());
String beanName = this.beanNameGenerator.generateBeanName(candidate, this.registry);
if (candidate instanceof AbstractBeanDefinition) {
// 设置默认值和不知道干什么的方法
postProcessBeanDefinition((AbstractBeanDefinition) candidate, beanName);
}
if (candidate instanceof AnnotatedBeanDefinition) {
// 解析 @Lazy、@DependsOn、@Role和@Description注解
AnnotationConfigUtils.processCommonDefinitionAnnotations((AnnotatedBeanDefinition) candidate);
}
// 检查bean是否被注册
if (checkCandidate(beanName, candidate)) {
// 构造一个BeanDefinitionHolder一,BeanDefinitionHolder中封装着beanName和BeanDefinition
BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(candidate, beanName);
// 这个先忽略
definitionHolder =
AnnotationConfigUtils.applyScopedProxyMode(scopeMetadata, definitionHolder, this.registry);
beanDefinitions.add(definitionHolder);
// 注册beanDefinition到map中
registerBeanDefinition(definitionHolder, this.registry);
}
}
}
return beanDefinitions;
}
标签:candidate,definitionHolder,beanName,扫描,bean,BeanDefinition 来源: https://www.cnblogs.com/lyraHeartstrings/p/16335555.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。