@ComponentScan中使用filter

我之所以多这个注解感兴趣,是因为最近开到SpringBootApplication这个注解继承的注解就配置了Filter。

2021-07-12-20-05-33

我认为相关的知识我使用的频率非常的低。

excludeFilters

代码如下:

1
2
3
4
5

@ComponentScan(value = "fun.junjie.demo", excludeFilters = {
    @Filter(type = FilterType.ANNOTATION, classes = {Controller.class})
})

@ComponentScan的value参数指明了需要扫描的包,excludeFilters指明了扫描的时候排除哪些类。

@Filter的type指明了类中带有某个注解则不进行注入,classes指明了具体时哪个注解。

includeFilters

这个注解说明了扫描的时候,只包含哪些类。

常用的规则

ANNOTATION:注解
ASSIGNABLE_TYPE:指定的类型
ASPECT:使用aspect的表达式(不理解,也从来没用过)
REGEX:使用正则的表达式
CUSTOM:使用自定义规则

开发自己的TypeFilter

代码如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22

public class MyTypeFilter  implements TypeFilter {
    @Override
    public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
        /*
            matadataReader:读取到的当前正在扫描的类的信息
            metadataReaderFactory:可以获取到其他任何类的信息
         */

        // 获取当前类注解的信息
        metadataReader.getAnnotationMetadata();

        // 获取当前正在扫描的类的信息
        metadataReader.getClassMetadata();

        // 获取当前类资源(类的路径)
        metadataReader.getResource();

        return false;
    }
}

其他知识

  1. 如果是jdk8,@ComponentScan组件可以在一个类中重复使用多次

2021-07-12-20-09-21

2021-07-12-20-10-06

在实践中,我发现因为SpringBootApplication中使用了该注解,所以DemoApplication不能再使用该注解了。看样子继承会影响到重复性。

  1. 如果不是jdk8,可以使用@ComponentScans策略来实现相同的效果
1
2
3
4
5
6
7
8

@ComponentScans(
    value={
        @ComponentScan(value="fun.junjie1", includeFilters = {}),
        @ComponentScan(value="fun.junjie2", includeFilters = {})
    }
)