4、組件注冊-自定義TypeFilter指定過濾規則
4.1 FilterType.ANNOTATION 按照注解方式
4.2 FilterType.ASSIGNABLE_TYPE 按照給定的類型
@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = {BookService.class})
4.3 FilterType.ASPECTJ 按照ASPECTJ表達式
4.4 FilterType.REGEX 按照正則表達
4.5 FilterType.CUSTOM 按照自定義規則
@ComponentScan(value = "com.hw.springannotation", useDefaultFilters = false,
includeFilters = {
// @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = {Controller.class}),
// @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = {BookService.class}),
@ComponentScan.Filter(type = FilterType.CUSTOM, classes = {MyTypeFilter.class})
}
) // 指定只掃描
- 創建MyTypeFilter類,需要實現TypeFilter 接口,重寫match()方法
package com.hw.springannotation.config;
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;
import java.io.IOException;
/**
* @Description TODO
* @Author hw
* @Date 2018/11/27 18:49
* @Version 1.0
*/
public class MyTypeFilter implements TypeFilter {
/**
* Determine whether this filter matches for the class described by
* the given metadata.
*
* @param metadataReader the metadata reader for the target class 讀取到得當前正在掃描的類的信息
* @param metadataReaderFactory a factory for obtaining metadata readers 一個可以探索其他類信息的工廠類
* for other classes (such as superclasses and interfaces)
* @return whether this filter matches
* @throws IOException in case of I/O failure when reading metadata
*/
public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
// 獲取當前類的注解信息
AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();
// 獲取當前類信息
ClassMetadata classMetadata = metadataReader.getClassMetadata();
// 獲取當前類的資源(類的路徑)
Resource resource = metadataReader.getResource();
String className = classMetadata.getClassName();
System.out.println("----" + className);
if (className.contains("er")) {
return true;
}
return false;
}
}
