spring 如何解析@ComponentScan 源码阅读

本文探讨了Spring如何解析@ComponentScan注解。ComponentScanAnnotationParser类的parse()方法用于解析注解,创建ClassPathBeanDefinitionScanner实例进行扫描。在扫描过程中,通过registerDefaultFilters添加了@Component注解的过滤器,并在doScan()中注册Bean。ConfigurationClassParser类在doProcessConfigurationClass()中处理@ComponentScans信息,调用ComponentScanAnnotationParser的parse()方法。整个流程涉及多个类,从ConfigurationClassPostProcessor到AbstractApplicationContext,逐步完成Bean定义的注册。
摘要由CSDN通过智能技术生成

@ComponentScan包扫描功能实现

实现过程:

① @ComponentScan 这个注解的作用

作用自己搜索

② spring 如何解析@ComponentScan:

spring的核心模块spring-context中的package org.springframework.context.support中,有个注解解析类ComponentScanAnnotationParser

ComponentScanAnnotationParser有个方法parse(),这个方法就是用来解析ComponentScan的,

在parse()中定义了ClassPathBeanDefinitionScanner,ClassPathBeanDefinitionScanner scanner

= new ClassPathBeanDefinitionScanner(…); scanner 是扫描器。同时parse()实现对

@ComponentScan的useDefaultFilters、scopedProxy、scopedProxy、scopeResolver、

resourcePattern,includeFilters、excludeFilters、lazyInit、basePackageClasses、basePackages等属

性的访问获取信息生成一个对象,然后给scanner.doScan()使用。

在ClassPathBeanDefinitionScanner主要两个tips:

1、ClassPathBeanDefinitionScanner构造器中的执行的父类的 registerDefaultFilters()方法,在这个方法中this.includeFilters.add(new AnnotationTypeFilter(Component.class)); 添加了带有@Component注解的类

ClassPathBeanDefinitionScanner的doScan扫描方法中,用registerBeanDefinition(definitionHolder, this.registry)方法注册了bean, definitionHolder, bean的信息持有者,registry注册器。在registerBeanDefinition()方法中调用了BeanDefinitionReaderUtils.registerBeanDefinition()进行bean注册,而这个方法最终使用的是registry进行注册的,代码是这样: registry.registerBeanDefinition(beanName,definitionHolder.getBeanDefinition());

2、registry在哪里:

ConfigurationClassParser类的构造器中使用就是BeanDefinitionRegistry的registry,ConfigurationClassParser下文会介绍。

public ConfigurationClassParser(MetadataReaderFactory metadataReaderFactory,
	ProblemReporter problemReporter, Environment environment, ResourceLoader resourceLoader,
	BeanNameGenerator componentScanBeanNameGenerator, BeanDefinitionRegistry registry) {

this.metadataReaderFactory = metadataReaderFactory;
this.problemReporter = problemReporter;
this.environment = environment;
this.resourceLoader = resourceLoader;
this.registry = registry;
this.componentScanParser = new ComponentScanAnnotationParser(
		environment, resourceLoader, componentScanBeanNameGenerator, registry);
this.conditionEvaluator = new ConditionEvaluator(registry, environment, resourceLoader);

}

③ ConfigurationClassParser:

位置

package org.springframework.context.annotation#ConfigurationClassParser

ConfigurationClassParser:这个类为配置类解析器

这个类型有个方法doProcessConfigurationClass,在这个方法中定义了@ComponentScans信息,
Set componentScans = AnnotationConfigUtils.attributesForRepeatable(
sourceClass.getMetadata(), ComponentScans.class, ComponentScan.class);

componentScans包含了注解@ComponentScans的各种属性,

然后调用 this.componentScanParser.parse(这个ComponentScanAnnotationParser类的方法parse)
会对各种属性进行分析并执行相应的功能。

具体代码:

// Process any @ComponentScan annotations
		Set<AnnotationAttributes> componentScans = AnnotationConfigUtils.attributesForRepeatable(
				sourceClass.getMetadata(), ComponentScans.class, ComponentScan.class);
		if (!componentScans.isEmpty() &&
				!this.</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值