基于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的封装。

总结

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

相关文章

  • Java避免死锁_动力节点Java学院整理

    Java避免死锁_动力节点Java学院整理

    在有些情况下死锁是可以避免的。本文将展示三种用于避免死锁的技术。对java避免死锁的相关知识感兴趣的朋友一起通过本文学习吧
    2017-06-06
  • Springboot手动连接库并获取指定表结构的示例代码

    Springboot手动连接库并获取指定表结构的示例代码

    这篇文章主要介绍了Springboot手动连接库并获取指定表结构的示例代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07
  • java通过AOP实现全局日志打印详解

    java通过AOP实现全局日志打印详解

    最近自己一直再看现有微服务的日志模块,发现就是使用AOP来做controller层的日志处理,加上项目在进行架构优化,这篇文章主要给大家介绍了关于java通过AOP实现全局日志打印的相关资料,需要的朋友可以参考下
    2022-01-01
  • Spark调优多线程并行处理任务实现方式

    Spark调优多线程并行处理任务实现方式

    这篇文章主要介绍了Spark调优多线程并行处理任务实现方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • Java中map和flatMap的区别举例详解

    Java中map和flatMap的区别举例详解

    这篇文章主要给大家介绍了关于Java中map和flatMap区别的相关资料,在Java中Stream接口有map()和flatmap()方法,两者都有中间流操作,并返回另一个流作为方法输出,需要的朋友可以参考下
    2023-10-10
  • java中TCP/UDP详细总结

    java中TCP/UDP详细总结

    本篇文章对Java中的TCP/UDP知识点进行了归纳总结分析。需要的朋友参考下
    2017-04-04
  • springboot @validated List校验失效问题

    springboot @validated List校验失效问题

    这篇文章主要介绍了springboot @validated List校验失效问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • SpringCloud微服务多应用脚手架的搭建与部署方式

    SpringCloud微服务多应用脚手架的搭建与部署方式

    这篇文章主要介绍了SpringCloud微服务多应用脚手架的搭建与部署方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • SpringBoot整合Ehcache3的实现步骤

    SpringBoot整合Ehcache3的实现步骤

    本文主要介绍了SpringBoot整合Ehcache3的实现步骤,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • Java中获取时间戳的三种方式对比实现

    Java中获取时间戳的三种方式对比实现

    这篇文章主要介绍了Java中获取时间戳的三种方式对比实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01

最新评论