ClassPathBeanDefinitionScanner源码分析

2024-11-17 18:49:25

1、打开ClassPathBeanDefinitionScanner类,根据源码可以看到,这个扫描器会自动扫描被Component、Repository、Service、Controller修饰的类。

ClassPathBeanDefinitionScanner源码分析

2、再来看扫描的入口,是AnnotationConfigApplicationContext的scan方法,进入这个类,并找到scan方法,一直向下找,发现最终就是调用的ClassPathBeanDefinitionScanner类的doScan方法。

ClassPathBeanDefinitionScanner源码分析

3、且看doScan方法,此方法有一个参数,string数组:String... basePackages。调试启动项目打一个断点,可以看到b锾攒揉敫asePackages就是这个项目的跟路径。(maven项目,组名+项目名),也就是说会自动扫描整个项目。doScan方法中有一个调用是,findCandidateComponents方法,这个方法的作用是:扫描类路径,找到候选的组件,也即被Component、Repository、Service、Controller修饰的类。

ClassPathBeanDefinitionScanner源码分析ClassPathBeanDefinitionScanner源码分析

4、在findCandidateComponents方法中的getResources方法调用的下方打上断点,getResources方法的作用是获取当前包下的所有class文件。通过调试可以看到,resource共有15个元素,拷贝出来调试的当前数据和项目包下的java文件比对,发现刚刚好,就是这15个文件。此时Resource[] resources就是存储的当前项目下所有类的class文件的绝对地址。

ClassPathBeanDefinitionScanner源码分析ClassPathBeanDefinitionScanner源码分析ClassPathBeanDefinitionScanner源码分析ClassPathBeanDefinitionScanner源码分析

5、继续向下走,findCandidateComponents方法中还有一个重要的过虑方法,我们虽然获取到了15个class文件,但是并不是所有的都是必要的,这个过滤方法是isCandidateComponent,用于过滤非Component组件,即只选择:Component、Repository、Service、Controller修饰的类。

ClassPathBeanDefinitionScanner源码分析

6、进入isCandidateComponent方法,打上断点,可以看到tf就是Component。

ClassPathBeanDefinitionScanner源码分析

7、再回到doScan方法,发现候选组件经过过滤变成了11个。

ClassPathBeanDefinitionScanner源码分析ClassPathBeanDefinitionScanner源码分析

8、经过层层的筛选,最终符合条件的类就可以去完成注册了,registerBeanDefinition方法就是:用给定的注册表注册指定的bean。也就是把数据(beanName等bena定义信息)存储到一个map(beanDefinitionMap)的数据结构中(DefaultListableBeanFactory的registerBeanDefinition方法中),map的key就是beanName。

ClassPathBeanDefinitionScanner源码分析ClassPathBeanDefinitionScanner源码分析

9、为了看一下beanDefinitionMap到底存的什么,打上断点,获取其内容,可以看到这个map中的key就是beanName,值就是这个bean的一些信息,包括类的全路径名称、资源的绝对地址、单例等信息。

ClassPathBeanDefinitionScanner源码分析ClassPathBeanDefinitionScanner源码分析

10、doScan方法最后返回完成注册的bean的集合,这次只分析到这里了,扫描的过程,但是还是没有看到其实如何注入的,以后再了解吧。猜想应该是,先通过DefaultListableBeanFactory类的getBeanDefinition方法,获取类的描述信息,然后再通过反射注入对象。

ClassPathBeanDefinitionScanner源码分析
猜你喜欢