我之所以多这个注解感兴趣,是因为最近开到SpringBootApplication这个注解继承的注解就配置了Filter。
我认为相关的知识我使用的频率非常的低。
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;
}
}
|
其他知识
- 如果是jdk8,@ComponentScan组件可以在一个类中重复使用多次
在实践中,我发现因为SpringBootApplication中使用了该注解,所以DemoApplication不能再使用该注解了。看样子继承会影响到重复性。
- 如果不是jdk8,可以使用@ComponentScans策略来实现相同的效果
1
2
3
4
5
6
7
8
|
@ComponentScans(
value={
@ComponentScan(value="fun.junjie1", includeFilters = {}),
@ComponentScan(value="fun.junjie2", includeFilters = {})
}
)
|