spring源码-ClassPathBeanDefinitionScanner分支详解
前面reader看完了,我们继续看ClassPathBeanDefinitionScanner他做了什么
进入查看他的带AnnotationConfigApplicationContext的构造函数

那么进入到两个参数的构造函数中
两个参数的构造函数又会去调用三个参数的构造函数
三个参数的构造函数又会去调用四个参数的构造函数
最后调用到同类下的四参构造函数,这里的useDefaultFilters是前面第一次进来,调用二参构造函数时传入的一个true,那么就会进入到这个判断体中,那么进入这个registerDefaultFilters()方法一探究竟
我们可以看到有一个includeFilters做了add操作,用annotationTypeFilter(Class)的构造函数的返回值,我们可以先看看这两个方法到底干了什么,先看参数,进入到AnnotationTypeFilter(注解类型过滤器)
同样的构造函数的一个调用链,最后执行到这个构造函数

从构造函数名字和注释来看,注解类型过滤器,super(true,true)
查看传进来的component.class是否继承匹配inherited元注解,同时不匹配接口
再回到这里,将component.class进行赋值,同时匹配元注解,同时提供了一些方法

通过这几个方法我们可以猜测这个过滤器的一个大概,应该是用来匹配@component的,我们接着往下看this.includeFilters是干嘛的

includeFilters是一个linkedList,我们看下这一段注释

那么这个this.includeFilters大概就是用来识别需要被扫描的spring组件,比如说加入了component就相当于加入了controller,repository,service,那么到时候我们扫描到这几个注解,就能够被识别并创建bean
又加两个注解
这里就是registerDefaultFilters方法的作用,用来添加需要被识别的注解

最后set一下环境和loader
这个就是ClassPathBeanDefinitionScanner分支
总的来说ClassPathBeanDefinitionScanner分支是在做一个非常重要的作用,是这样的,假设我们开始componentScan扫描了,我们扫描到的注解会进入ClassPathBeanDefinitionScanner中的this.includeFilters去做判断,如果这个注解是在这linkedList存在,那么就进行创建。
源码中它加载了componet注解,那么扫描到component注解和它的子注解,那么就会被识别到创建成bean

浙公网安备 33010602011771号