1. 程式人生 > >spring註解版 TypeFilter自定義掃描bean規則

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),因為預設是包含所有的。