本章节将介绍 @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 注解的类。