Spring註解驅動第三講--@Filter介紹

上一講主要針對@ComponentScan註解做了一些說明,本文主要對@Filter的掃描條件,再做一些詳細的介紹

1,FilterType.ANNOTATION 按照註解的方式進行掃描.後面classes屬性,爲註解的類型,如:

複製代碼

@Configuration//標記此類爲配置類
@ComponentScan(value="com.wxj",excludeFilters= {
        @Filter(type=FilterType.ANNOTATION,classes= {Controller.class})
})
public class MainConfig {
    //將標有@Controller註解的類排除在外不會加載到容器中來
}

複製代碼

2,type=FilterType.ASSIGNABLE_TYPE,按照指定的類,進行過濾,後面的classes屬性的值爲"類名.class".如:

複製代碼

@Configuration//標記此類爲配置類
@ComponentScan(value="com.wxj",
includeFilters= {
        @Filter(type=FilterType.ASSIGNABLE_TYPE,classes= {BookService.class})
},useDefaultFilters=false)
public class MainConfig {
    //只會加載BookService,以及BookService的子類或者其實現類
}

複製代碼

以上兩種方式爲常用的過濾方式.

3,FilterType.CUSTOM,按照自己自定義的方式來進行過濾和篩選(使用此過濾類型,雖然比較繁瑣,但是使用起來完全可以由自己來定義掃描的規則)

首先定義@Filter註解的類型

複製代碼

@Configuration//標記此類爲配置類
@ComponentScan(value="com.wxj",
includeFilters= {        @Filter(type=FilterType.CUSTOM,classes{MyTypeFilter.class})
},useDefaultFilters=false)
public class MainConfig {
}

複製代碼

MyTypeFilter即爲自己定義的匹配方法,其中MyTypeFilter類中的match方法的返回值爲true時,爲符合過濾條件,如果返回爲false,則不符合過濾條件,代碼如下:

複製代碼

public class MyTypeFilter implements TypeFilter {

    /**
     * MetadataReader metadataReader:獲取當前正在掃描的類的信息
     * MetadataReaderFactory metadataReaderFactory,獲取帶其他任何類的信息
     * 
     */
    public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
        AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();//獲取當前類的註解信息
        ClassMetadata classMetadata = metadataReader.getClassMetadata();//獲取當前掃描的類信息
        Resource resource = metadataReader.getResource();//獲取當前掃描的資源信息
        String name = classMetadata.getClassName();//獲取類的名字
        if(name.contains("er")) {
            return true;//如果類的名字中帶有"er",則符合過濾的要求
        }
        return false;
    }

}

複製代碼

注:TypeFilter中的ASPECTJ和REGEX(正則方式),沒有介紹,使用較少,有興趣可以自行研究.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章