上一講主要針對@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(正則方式),沒有介紹,使用較少,有興趣可以自行研究.