ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

BeanDefinition扫描

2022-06-01 20:31:32  阅读:149  来源: 互联网

标签:candidate definitionHolder beanName 扫描 bean BeanDefinition


执行流程

  1. 根据classpath:* + 包名获取所有.class文件
  2. 遍历Resouce资源文件。
  3. 判断当前resouce文件所指的类是否拥有component注解,也就是判断该bean是否要扫描到spring容器中。
  4. 构建beanDefiniation,并将资源和类全限定包名设置上去。
  5. 在上一步仅仅是构造了BeanDefiniation并将bean全限定名称设置上去,但是类是否为单例、是否懒加载等等还没有设置,所以接下来要设置其余BeanDefiniation。
  6. 遍历BeanDefinitionList,并设置scope。
  7. 获取并设置beanName。
  8. 设置beanDefiniation默认值。
  9. 解析 @Lazy、@DependsOn、@Role和@Description注解
  10. 检查bean是否注册过,如果没注册过则对bean进行注册。

AnnotationConfigApplicationContext

首先AnnotationConfigApplicationContext新建了两个对象,分别是BeanDefinition读取器和扫描器,Bean是由扫描器来进行扫描的,先从这个类看起,spring是怎样完成扫描操作的。
image

包扫描

ClassPathBeanDefinitionScanner中有个scan方法用于进行包扫描的,在这个方法中有个doScan方法用于完成扫描逻辑,进入这个方法看一下。
image
主要注释已经写完了,通过扫描将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. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有