本章节将介绍 @ComponentScans 注解,该注解可以一次声明多个 @ComponentScan 注释。关于 @ComponentScan 注解的用法请参考上一个章节。
它可以本地使用,声明几个嵌套的 @ComponentScan 注解。也可以与 Java 8 对可重复注释的支持结合使用,在该方法中,可以简单地在同一方法上多次声明 @ComponentScan,从而隐式生成此容器注释。
我们先看 @ComponentScan 注解的源码,如下:
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @Documented @Repeatable(ComponentScans.class) public @interface ComponentScan { }
上面 @ComponentScan 注解源码上面使用了 @Repeatable 注解,表示该注解可以被 @ComponentScans 作为数组使用。
再来看看 @ComponentScans 注解源码,如下:
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @Documented public @interface ComponentScans { ComponentScan[] value(); }
该注解的 value() 属性是一个 @ComponentScan 注解数组。
下面实例在 @ComponentScans 注解中声明了两个 @ComponentScan 注解,如下:
@ComponentScans({ @ComponentScan(basePackages = { "com.huangx.springboot.controller" }, includeFilters = { // 仅仅使用了 @RestController 注解声明的类 @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = { RestController.class }) }, useDefaultFilters = false), @ComponentScan(basePackages = { "com.huangx.springboot.controller2" }, excludeFilters = { // 过滤使用了 @MyAnnotation 注解的类 @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = { MyAnnotation.class }) }) }) public class MyConfig { }
上面实例中,第一个 @ComponentScan 注解将扫描 com.huangx.springboot.controller 包及子包下面声明了 @RestController 注解的类;第二个 @ComponentScan 注解将过滤 com.huangx.springboot.controller2 包及子包下声明了 @MyAnnotation 注解的类。