Spring中自定义FilterType指定组件过滤规则
1、如果要自定义组件扫描过滤类型,需要继承TypeFilter接口。
2、在TypeFilter中有一个需要实现的接口方法:boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException;这个接口有两个参数:MetadataReader表示读取到的当前正在扫描的类的信息。MetadataReaderFactory 表示可以获得到其他任何类的信息。
3、新建一个组件过滤器自定义TypeF坡纠课柩ilter类:MyTypeFilter。package com.gwolf.con熠硒勘唏fig;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 MyTypeFilter implements TypeFilter { @Override 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+"-------------"); return false; }}
4、在组件扫描配置类上配置上述的自定义组件扫描类:package com.gwolf.config;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.ComponentScan.Filter;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.FilterType;import org.springframework.stereotype.Controller;import com.gwolf.vo.Person;@Configuration@ComponentScan(value="com.gwolf",includeFilters= {@Filter(type = FilterType.ANNOTATION, classes= {Controller.class}), @Filter(type = FilterType.CUSTOM, classes= {MyTypeFilter.class})},useDefaultFilters=false)public class ComponentConfig { @Bean public Person getPerson() { return new Person("百度", 10000); }}
5、运行java测试类,查看自定义过滤器扫描打印的类名称。
6、接下来自定义扫描规则值扫描Service结尾的java类。package com.gwolf.config稆糨孝汶;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.ComponentScan.Filter;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.FilterType;import org.springframework.stereotype.Controller;import com.gwolf.vo.Person;package com.gwolf.config;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 MyTypeFilter implements TypeFilter { @Override 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(); if(className.contains("Service")) { return true; } return false; }}@Configuration@ComponentScan(value="com.gwolf",includeFilters= {@Filter(type = FilterType.ANNOTATION, classes= {Controller.class}), @Filter(type = FilterType.CUSTOM, classes= {MyTypeFilter.class})},useDefaultFilters=false)public class ComponentConfig { @Bean public Person getPerson() { return new Person("百度", 10000); }}