Spring 的类扫描器分析 - ClassPathBeanDefinitionScanner

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring 的类扫描器分析 - ClassPathBeanDefinitionScanner相关的知识,希望对你有一定的参考价值。

参考技术A SpringBoot项目中或者 Spring项目中配置 <context:component-scan base-package="com.example.demo" />
,那么在IOC 容器初始化阶段(调用beanFactoryPostProcessor阶段) 就会采用ClassPathBeanDefinitionScanner进行扫描包下 所有类,并将符合过滤条件的类注册到IOC 容器内。Mybatis 的Mapper注册器(ClassPathMapperScanner) 是同过继承ClassPathBeanDefinitionScanner,并且自定义了过滤器规则来实现的。具体的 调用过程并不会在这里说明,只是想在这里描述ClassPathBeanDefinitionScanner是如何 扫描 和 注册BeanDefinition的。

ClassPathBeanDefinitionScanner作用就是将指定包下的类通过一定规则过滤后 将Class 信息包装成 BeanDefinition 的形式注册到IOC容器中。

过滤器用来过滤 从指定包下面查找到的 Class ,如果能通过过滤器,那么这个class 就会被转换成BeanDefinition 注册到容器。

如果在实例化ClassPathBeanDefinitionScanner时,没有说明要使用用户自定义的过滤器的话,那么就会采用下面的默认的过滤器规则。

注册了 @Component 过滤器到 includeFiters ,相当于 同时注册了所有被 @Component 注释的注解,包括 @Service , @Repository , @Controller ,同时也支持java EE6 的 javax.annotation.ManagedBean 和 JSR-330 的 @Named 注解。

实际执行包扫描,进行封装的函数是findCandidateComponents,findCandidateComponents定义在父类中。ClassPathBeanDefinitionScanner的主要功能实现都在这个函数中。

通过自定义的扫描器,扫描指定包下所有被@MyBean 注释的类。

通过对ClassPathBeanDefinitionScanner的分析,终于揭开了Spring 的类扫描的神秘面纱,其实,就是对指定路径下的 所有class 文件进行逐一排查,对符合条件的 class ,封装成 BeanDefinition注册到IOC 容器。

理解ClassPathBeanDefinitionScanner的工作原理,可以帮助理解Spring IOC 容器的初始化过程。

同时对理解MyBatis 的 Mapper 扫描 也是有很大的帮助。
因为 MyBatis 的MapperScannerConfigurer的底层实现也是一个ClassPathBeanDefinitionScanner的子类。就像我们自定义扫描器那样,自定定义了 过滤器的过滤规则。

以上是关于Spring 的类扫描器分析 - ClassPathBeanDefinitionScanner的主要内容,如果未能解决你的问题,请参考以下文章

spring 排除指定的类或者包扫描

springboot条件注解源码分析

spring 自动扫描注册的类是否可以定义构造函数

Spring-扫描注解原理,注解自动扫描原理分析

Spring IoC 源码分析 (基于注解) 之 包扫描

Spring IoC 源码分析 (基于注解) 之 包扫描