spring註解版 TypeFilter自定義掃描bean規則
最近決定從學一下spring,以前學的時候很多東西就不怎麼理解,這裡開始好好學學。
今天看了自定義TypeFilter,在掃描包的時候可能會用到吧。
@ComponentScan(value = "top.blogs", includeFilters = {@Filter(type = FilterType.ANNOTATION, classes = { Controller.class })}, useDefaultFilters = false)
以上includeFilters是指包含掃描;FilterType.ANNOTATION 指掃描規則,用的按註解方式,其實還有以下幾種
FilterType.ANNOTATION:按註解
FilterType.ASSIGNABLE_TYPE:按給定型別
FilterType.ASPECTJ:使用ASPECTJ
FilterType.REGEX:使用正則
FilterType.CUSTOM:使用自定義規則
這裡要記錄的就是以上最後一種,自定義規則
首先準備一個類MyFilter,需繼承TypeFilter
import java.io.IOException; import org.springframework.core.io.Resource; import org.springframework.core.type.AnnotationMetadata; import org.springframework.core.type.ClassMetadata; import org.springframework.core.type.classreading.MetadataReader; import org.springframework.core.type.classreading.MetadataReaderFactory; import org.springframework.core.type.filter.TypeFilter; public class MyFilter implements TypeFilter { /** * metadataReader:讀取到的當前正在掃描的類的資訊 * metadataReaderFactory:可以獲取到其他任何類資訊 */ public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException { // 獲取當前類註解資訊(當前類指componentScan指定掃描的類,) AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata(); // 獲取當前正在掃描的類的類資訊 ClassMetadata classMetadata = metadataReader.getClassMetadata(); // 獲取當前類的資源(類的路徑) Resource resource = metadataReader.getResource(); // 獲取類名 String className = classMetadata.getClassName(); // 測試,類名包含"service"就返回true if (className.contains("service")) { return true; } return false; } }
註釋寫得很清除了,裡面有一些常用的方法。這裡我是對類名搞了點規則,就是類名包含"service"的就可以包含進去
然後再把規則加到@ComponentScan裡面就ok
@ComponentScan(value = "test.spring", includeFilters = {
@Filter(type = FilterType.CUSTOM, classes = MyFilter.class) }, useDefaultFilters = false)
以上classes指定的是我們自定義的MyFilter類,並且需要禁用預設的包含規則(useDefaultFilters = false),因為預設是包含所有的。