springboot @ComponentScan排除指定類


因為A工程依賴於B工程,B工程為某些通用模塊的工程,含有controller、service等通用業務。這時A項目會配置@ComponentScan掃碼B工程的包,由於某種原因需要排除某些被@Service標注的類,不將他們加入spring容器中,於是就用上了@ComponentScan的excludeFilters屬性。

使用方法

excludeFilters屬性需要傳遞@ComponentScan.Filter注解
該注解需指定FilterType,FilterType共有下面5種選擇:

  • ANNOTATION
    篩選含有某個注解的,例如
    @ComponentScan(excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION,value = {ExcludeComponent.class}))
    其中ExcludeComponent是我個人指定的注解可以自己建,只要有該注解標注就會被排除。

  • ASSIGNABLE_TYPE 篩選指定類型的

  • ASPECTJ 篩選匹配給定AspectJ類型模式表達式的

  • REGEX 篩選正則表達式匹配的

  • CUSTOM 自定義篩選

自定義

自定義規則需繼承org.springframework.core.type.filter.TypeFilter類,實現match方法即可。例如:

public class CustomFilter implements TypeFilter {

    private static final String PACKAGE = ".aaa.";

    @Override
    public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) {
        // 可以通過MetadataReader獲得各種信息,然后根據自己的需求返回boolean,實例表示包名含有aaa路徑的類名將滿足篩選條件。
        return metadataReader.getClassMetadata().getClassName().contains(PACKAGE);
    }

}

配置
@ComponentScan(excludeFilters = @ComponentScan.Filter(type = FilterType.CUSTOM, classes = CustomFilter.class))
結果就是含有aaa路徑的類名將被排除不被加入spring容器中。

注意事項

如果工程中存在多個@ComponentScan,需要都進行excludeFilters配置否排除會失效!!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM