这是用来解析xml文件中,componentscan 标记的
大体上分四步:
- 获取 base-package属性,使用,; 分割每个目录
- 创建scanner
- 使用scanner解析目录中所有的文件
- 筛选出带有component注解(controller等注解也算component)的bean,注册到ReaderEventListener和factory中
方法为
public BeanDefinition parse(Element element, ParserContext parserContext) {
String basePackage = element.getAttribute("base-package");
basePackage = parserContext.getReaderContext().getEnvironment().resolvePlaceholders(basePackage);
String[] basePackages = StringUtils.tokenizeToStringArray(basePackage, ",; \t\n");
ClassPathBeanDefinitionScanner scanner = this.configureScanner(parserContext, element);
Set<BeanDefinitionHolder> beanDefinitions = scanner.doScan(basePackages); //会把扫描到的beanDefinition注册到factory中
this.registerComponents(parserContext.getReaderContext(), beanDefinitions, element); //把扫描到的bean和一些processer打包成CompositeComponentDefinition,然后注册到ReaderEventListener中
return null;
}
命名空间 | 处理器 |
---|---|
property-override | PropertyOverrideBeanDefinitionParser |
annotation-config | AnnotionConfigBeanDefinitionParser |
mbean-server | MBeanServerBeanDefinitionParser |
component-scan | ComponentScanBeanDefinitionParser |
load-time-weaver | LoadTimeWeaverBeanDefinitionParser |
property-placeholder | PropertyPlaceholderBeanDefinitionParser |
spring-configured | SpringConfiguredBeanDefinitionParser |
mbean-export | MBeanExportBeanDefinitionParser |