Spring :@ComponentScan设置需要过滤或扫描的bean

@ComponentScan可以用来将指定的某些包下所有带有@Component、@Repository、@Controller、@Service的类加入到spring容器中。但是有时候,我们可能希望过滤掉一些类,或者根据实际情况的不同加入不同的类。这是就需要使用到includeFiltersexcludeFilters

形式类似于:

@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容器中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值