@ComponentScan是Spring的包扫描组件,作用在配置类上。
其常用属性介绍:
value:代表需要扫描的包,扫描包下的Controller,Service, Repository,Component注解标注的类,将其注入IOC容器
例子:
@ComponentScan(value="com.testSpringAnnotation")
意思是扫描"com.testSpringAnnotation"包下Controller,Service, Repository,Component注解标注的类
excludeFilters :是一个 Filter[]数组,作用是排除不需要扫描的包或者类。Filter[]数组里面需要@Filter指定过滤规则,@Filter的type属性表示过滤的规则;@Filter的classes属性是个数组,里面包含需要过滤的类。
例子:
@ComponentScan(value="com.testSpringAnnotation",excludeFilters= {
@Filter(type=FilterType.ANNOTATION,classes= {Controller.class})
})
意思是:扫描"com.testSpringAnnotation"包,除了Controller注解标注的类,其他三个组件标注的类注入IOC容器
includeFilters :是一个 Filter[]数组,作用是指定扫描的时候只需要包含哪些组件。用法与excludeFilters相同
useDefaultFilters:默认过滤规则选项,false时,可以自定义过滤规则
例子:
@ComponentScan(value="com.testSpringAnnotation",excludeFilters= {
@Filter(type=FilterType.ANNOTATION,classes= {Controller.class})
},useDefaultFilters = false)
对于 @Filter的type属性,有以下五种:
FilterType.ANNOTATION:按照注解(常用)
FilterType.ASSIGNABLE_TYPE:按照给定的类型(常用)
FilterType.ASPECTJ:使用ASPECTJ表达式(不常用)
FilterType.REGEX:使用正则表达式
FilterType.CUSTOM:使用自定义规则,需要实现TypeFilter接口,返回true或false来决定是否匹配
对于使用自定义规则,下面举个例子:
public class MyTypeFilter implements TypeFilter {
/*
* MetadataReader:读取到的当前正在扫描的类的信息
* MetadataReaderFactory:可以获取到其他任何类的信息
*/
@Override
public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory)
throws IOException {
//获取当前类注解的信息
AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();
//获取当前正在扫描类的类信息
ClassMetadata classMetadata = metadataReader.getClassMetadata();
//获取当前类资源(类的路径,哪个class文件等)
Resource resource = metadataReader.getResource();
String className = classMetadata.getClassName();
//自定义代码部分
System.out.println("-->"+className);//这句打印可以看出扫描顺序
if(className.contains("er")) {//类名包含er,则匹配成功.匹配成功的类会加载进容器中
return true;
}
return false;
}
}