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);
   i
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值