Spring中自定义FilterType指定组件过滤规则

2025-11-21 09:21:21

1、如果要自定义组件扫描过滤类型,需要继承TypeFilter接口。

Spring中自定义FilterType指定组件过滤规则

2、在TypeFilter中有一个需要实现的接口方法:

boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory)

throws IOException;

这个接口有两个参数:

MetadataReader表示读取到的当前正在扫描的类的信息。

MetadataReaderFactory 表示可以获得到其他任何类的信息。

Spring中自定义FilterType指定组件过滤规则

3、新建一个组件过滤器自定义TypeFilter类:MyTypeFilter。

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();

                

                System.out.println(className+"-------------");

                

                return false;

        }

}

Spring中自定义FilterType指定组件过滤规则

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);

}

}

Spring中自定义FilterType指定组件过滤规则

5、运行java测试类,查看自定义过滤器扫描打印的类名称。

Spring中自定义FilterType指定组件过滤规则

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);

        }

}

Spring中自定义FilterType指定组件过滤规则

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢