spring源码之processConfigBeanDefinitions()-4

ComponentScan扫描

回到doProcessConfigurationClass()这个方法中继续往下看,这部分就是解析ComponentScan并且扫描的代码,我们之前已经解析过了,就不再看这一部分了。 这里要注意一个点,就是在扫描出来所有的类,还会递归调用parse(),重新进入这个方法。因为一切皆配置类,要再次看一下扫描出来的类中是否有需要解析的配置信息。

处理Import注解

继续向下看源码,这一行就是处理所有的Import注解的。 其中getImports()方法是获取当前类上面Import注解中的所有类,返回的是一个set集合 点进这个方法看一下 这个方法里面主要有三个判断: 1、当前类是否为ImportSelector子类 2、当前类是否为ImportBeanDefinitionRegistrar子类 3、为普通类 则递归调用processConfigurationClass方法,按照上面的流程再来一遍

ImportSelector类的处理

处理Import注解的时候,有三个if判断,第一个判断就是处理ImportSelector的实现类 PS:要注意这处理的类不会放到单例池中

public class X implements ImportSelector {
          
   

	@Override
	public String[] selectImports(AnnotationMetadata importingClassMetadata) {
          
   
		return new String[]{
          
   "com.spring.enhancer.bean.Y","com.spring.enhancer.bean.Z"};
	}
}

ImportBeanDefinitionRegistrar类的处理

处理Import注解的时候,有三个if判断,第二个判断就是处理ImportBeanDefinitionRegistrar的实现类 这里就是放入了这个集合中,而这个集合存储的就是当前处理的类,引入的所有ImportBeanDefinitionRegistrar实现类 PS:要注意这处理的类不会放到单例池中

经验分享 程序员 微信小程序 职场和发展