Spring源码之扫描器(AnnotatedBeanDefinitionReader和ClassPathBeanDefinitionScanner)(三)

前言

Spring容器加载Bean定义信息的两个扫描器:
AnnotatedBeanDefinitionReader和ClassPathBeanDefinitionScanner
*从命名来看,前者是读取注解声明的bean的定义信息;后者是读取xml声明的bean的定义信息
本文将详细介绍这两个扫描器的初始化过程

1.准备工作

1.初始化一个spring容器对象
2.断点调试,跟踪查看扫描器的初始化过程

2.源码解析跟踪

public AnnotationConfigApplicationContext() {
   
   
   //创建一个读取注解的BeanDefinition读取器,AnnotationConfigApplicationContext实现了BeanDefinitionRegistry接口
   //此处可传入创建读取器
   this.reader = new AnnotatedBeanDefinitionReader(this);
   //将指定包下的类通过一定规则过滤后 将Class信息封装成BeanDefinition的形式注册到IOC容器中
   this.scanner = new ClassPathBeanDefinitionScanner(this);
}

2.1.AnnotatedBeanDefinitionReader的构造方法

public AnnotatedBeanDefinitionReader(BeanDefinitionRegistry registry) {
   
   
   this(registry, getOrCreateEnvironment(registry));
}
public AnnotatedBeanDefinitionReader(BeanDefinitionRegistry registry, Environment environment) {
   
   
   Assert.notNull(registry, "BeanDefinitionRegistry must not be null");
   Assert.notNull(environment, "Environment must not be null");
   this.registry = registry;
   //用于@Conditional注解的实现,此处不作跟踪
   this.conditionEvaluator = new ConditionEvaluator(registry, environment, null);
   //重点:注册注解配置处理器
   AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry);
}

2.2.AnnotationConfigUtils.registerAnnotationConfigProcessors方法

该方法主要是来初始化一下registry(也就是context)内的一些内容
public static void registerAnnotationConfigProcessors(BeanDefinitionRegistry registry) {
   
   
   registerAnnotationConfigProcessors(registry, null);
}
public static Set<BeanDefinitionHolder> registerAnnotationConfigProcessors(BeanDefinitionRegistry registry, @Nullable Object source) {
   
   
   //从registry(context)获取到beanFactory,对工厂的内容进行一些初始化
   DefaultListableBeanFactory beanFactory = unwrapDefaultListableBeanFactory(registry);
   if 

你可能感兴趣的:(Spring源码专题)