基于ComponentScan注解的扫描范围及源码解析

 更新时间:2023年09月25日 08:58:14   作者:春秋战国程序猿  
这篇文章主要介绍了基于ComponentScan注解的扫描范围及源码解析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

一.ComponentScan注解的默认扫描范围

ComponentScan注解的默认扫描范围是启动程序XxxApplication. java所在目录及其下的所有子包。

为了方便理解,我们看一下下面这个图片。

这个项目中的启动类是:SpringbootApplication.java

该启动类所在的目录是:springboot

那么ComponentScan注解的默认扫描范围是:springboot目录及其下面的所有子包。

二.如何修改ComponentScan注解的扫描范围

ComponentScan注解即可以扫描包,也可以扫描指定的类。

我们只需要指定一个包扫描的路径,就可以实现更改包扫描路径的功能了。

1.ComponentScan注解扫描包

@ComponentScan({"com.company.user","com.company.service"})

2.ComponentScan注解扫描类。

@ComponentScan(basePackageClasses={XxxService.class})

三.ComponentScan注解

ComponentScan注解中定义了12个属性,我们下面详细来看一下。

我们的讨论是基于java8的,spring-context的版本是4.3.7。

1.String[] value() default {};

指定包扫描路径,value属性的值,就是项目中的一个具体路径。

value属性的类型是String数组,也就是支持一次指定多个包扫描路径。

这个属性上面添加了一个注解,@AliasFor("basePackages"),这个注解的意思就是说,value这个属性等价于basePackages属性。

关于basePackages属性,下面会讲到。

2.String[] basePackages() default {};

指定包扫描路径,basePackages属性的值,就是项目中的一个具体路径。

  • basePackages属性的类型是String数组,也就是支持一次指定多个包扫描路径。
  • basePackages属性上面添加了一个注解,@AliasFor("value"),这个注解的意思就是说,basePackages这个属性等价于value属性。

3.Class<?>[] basePackagesClasses() default {};

扫描具体的类。

basePackagesClasses属性的类型是Class数组,也就是说支持同时指定多个扫描类。

4,Class<? extends BeanNameGenerator> nameGenerator() default BeanNameGenerator. class;

配置beanName生成器,默认是BeanNameGenerator。

一般情况下,我们都是使用默认的beanName生成器,但是Spring实现了beanName生成器的可配置。

5,Class<? extends ScopeMetaDataResolver> scopeResolver() default AnnotationScopeMetaDataResolver.class;

处理检测到的bean的scope范围。

什么意思呢?

我们都知道spring的bean是有作用域的,默认是singleton,这个默认值就是在ScopeMetaData类中指定的:

private String scopeName = "singleton";

这个属性也是可选配置,默认的处理bean作用域的实现类是AnnotationScopeMetaDataResolver.class。

源码比较简单,就是取注解上获取指定的scope的value值,如果没有配置,就是用默认的singleton。

6.ScopedProxyMode scopedProxy() default ScopedProxyMode. DEFAULT;

是否为检测到的组件生产代理。

ScopedProxyMode是一个枚举类,可选值有四个:

  • DEFAULT
  • NO
  • INTERFACES
  • TARGET_CLASS

7.String resourcePattern() default """**/*.class";

控制符合组件检测条件的类文件,默认是包扫描下的 **/*.class。

8.boolean useDefaultFilters() default true;

是否对含有以下注解的类开启检测,默认是开启的。

  • @Component
  • @Repository
  • @Service
  • @Controller

9.ComponentScan.Filter[] includeFilters() default {};

指定某些Filter扫描到的类。听起来有些费劲,说白了就是指定了类型,扫描指定的这些类型。

可选类型有5种,定义在枚举类FilterType中:

  • 第一种:ANNOTATION
  • 第二种:ASSIGNABLE_TYPE
  • 第三种:ASPECTJ
  • 第四种:REGEX,正则表达式。
  • 第五种:CUSTOM,自定义类型。

10.ComponentScan.Filter[] excludeFilters() default {};

排除过滤器扫描的的类。

11.boolean lazyInit() default false;

扫描到的类是否开启懒加载,默认不开启。

12.

@Retention(RetentionPolicy.RUNTIME);
@Target({})
public @interface Filter {
FilterType type() default FilterType. ANNOTATION;
@AliasFor("classes")
Class<?>[] value() default {};
@AliasFor("value")
Class<?>[] classes() default {};
String[] pattern() default {};
}

ComponentScan的内部接口,主要是对Filter的封装。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Mybatis缓存机制详解与实例分析

    Mybatis缓存机制详解与实例分析

    Mybatis的缓存分为一级缓存和二级缓存,一级缓存是SqlSession级别的而二级缓存是mapper级别的,本文详细的介绍了Mybatis缓存机制与实例分析,文中有相关的代码示例供大家参考,需要的朋友可以参考下
    2023-11-11
  • Spring Boot中@ConditionalOnProperty的使用方法

    Spring Boot中@ConditionalOnProperty的使用方法

    这篇文章主要给大家介绍了关于Spring Boot中@ConditionalOnProperty的使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者使用Spring Boot具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-12-12
  • java学习之junit单元测试案例(经典版)

    java学习之junit单元测试案例(经典版)

    这篇文章主要介绍了java学习之junit单元测试的相关资料,文中讲解了JUnit单元测试的基本概念、作用、使用assert进行验证、覆盖率分析、BeforeEach和AfterAll的使用、通过反射和注解实现测试,需要的朋友可以参考下
    2024-12-12
  • 分析ZooKeeper分布式锁的实现

    分析ZooKeeper分布式锁的实现

    在分布式的情况下,sychornized 和 Lock 已经不能满足我们的要求了,那么就需要使用第三方的锁了,这里我们就使用 ZooKeeper 来实现一个分布式锁
    2021-06-06
  • java构建Stream流的多种方式总结

    java构建Stream流的多种方式总结

    Java 8引入了Stream流作为一项新的特性,它是用来处理集合数据的一种函数式编程方式,本文为大家整理了多种java构建Stream流的方式,希望对大家有所帮助
    2023-11-11
  • Java8的default和static关键字的使用讲解

    Java8的default和static关键字的使用讲解

    今天小编就为大家分享一篇关于Java8的default和static关键字的使用讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • Spring中@Configuration注解的使用场景

    Spring中@Configuration注解的使用场景

    这篇文章主要介绍了Spring中@Configuration注解的使用场景,@Configuration注解是从Spring 3.0版本开始加入的一个使Spring能够支持注解驱动开发的标注型注解,主要用于标注在类上,需要的朋友可以参考下
    2023-11-11
  • Spring Boot DevTools 全局配置学习指南

    Spring Boot DevTools 全局配置学习指南

    这篇文章主要介绍了Spring Boot DevTools 全局配置,注意包括直接重启项目与devtools重启的区别,DevTools配置,DevTools全局配置及trigger-file控制重启行为的相关知识,需要的朋友可以参考下
    2022-03-03
  • 详解Spring mvc DispatchServlet 实现机制

    详解Spring mvc DispatchServlet 实现机制

    本篇文章主要介绍了详解Spring mvc DispatchServlet 实现机制,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • Java中Arrays.asList()方法详解及实例

    Java中Arrays.asList()方法详解及实例

    这篇文章主要介绍了Java中Arrays.asList()方法将数组作为列表时的一些差异的相关资料,需要的朋友可以参考下
    2017-06-06

最新评论