前言
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);
i