@ComponentScan可以用来将指定的某些包下所有带有@Component、@Repository、@Controller、@Service的类加入到spring容器中。但是有时候,我们可能希望过滤掉一些类,或者根据实际情况的不同加入不同的类。这是就需要使用到includeFilters和excludeFilters
形式类似于:
@ComponentScan(value="package",excludeFilters = {@ComponentScan.Filter(type = FilterType, value= xx.class)})
includeFilters和excludeFilters
- excludeFilters:Filter集合中的结果不加入spring容器中,用于过滤不想加入容器中的类
- includeFilters:Filter集合中的结果全加入spring容器中,用于添加特定的类到容器中
@ComponentScan默认情况下扫描全部类型注解,所以当使用includeFilters想要只将特定类型的类加入容器时需要将useDefaultFilters置为false
FilterType枚举类型
public enum FilterType {
ANNOTATION,
ASSIGNABLE_TYPE,
ASPECTJ, // 使用ASPECTJ表达式
REGEX, // 正则表达式
CUSTOM;
private FilterType() {
}
}
ANNOTATION指定某一类型注解
//ANNOTATION指定某一类型注解(三层中的某一类型)
@ComponentScan(value="com.yang",excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, value= {Service.class, Controller.class})})
value的值为Component.class、Service.class、Controller.class、Repository.class。
此例中包com.yang下带有@Service、@Controller注解的类全部不会加入到spring容器中
ASSIGNABLE_TYPE指定某一具体的类
@ComponentScan(value="com.yang",excludeFilters = {@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value= PersonService.class)})
value的值为具体的类
此例中包com.yang下的类PersonService就算带有@Component注解或者三层类型的注解,也不会被加入到spring容器中
CUSTOM自定义扫描器
使用自定义的扫描器需要编写一个实现了TypeFilter的类,重写match方法。
public class PersonFilter implements TypeFilter {
@Override
public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
ClassMetadata classMetadata = metadataReader.getClassMetadata();
String className = classMetadata.getClassName(); //扫描包下所有的类,获取带有三层类型注解的类名
//选出和Person有关的组件
if(className.contains("Person")){
return true;
}
return false;
}
}
@ComponentScan(value="com.yang",includeFilters = {@ComponentScan.Filter(type = FilterType.CUSTOM, value= {PersonFilter .class})})
value值为实现了TypeFilter的类。
此例中包com.yang下带有@Component、@Service、@Controller、@Repository注解并且类名中含有Person字段的类将会被加入到spring容器中。