ComponentScan自定义过滤规则

@ComponentScan自定义过滤规则

1. 工程搭建

首先创建一个maven工程,pom如下

<dependencies>    
    <dependency>        
        <groupId>org.springframework</groupId>        
        <artifactId>spring-context</artifactId>        
        <version>5.0.6.RELEASE</version>   
    </dependency>
</dependencies>

2. 创建如下工程结构

其中三层架构中的类都是一个空类,但在类上标了对应的注解
在这里插入图片描述

3.自定义过滤规则类

此处只有在类上标注了@controller注解的类才会被扫描加入到容器中

public class CustomFilterType implements TypeFilter {
    /**
     *
     * @param metadataReader 扫描的当前类的元数据信息
     * @param metadataReaderFactory 获取其他类的信息
     * @return
     * @throws IOException
     */
    public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
        //获取当前类注解信息
        AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();
        //获取当前类的类信息
        ClassMetadata classMetadata = metadataReader.getClassMetadata();
        //类路径
        Resource resource = metadataReader.getResource();
        //打印扫描到的类
        System.out.println("被扫描到的类:" + classMetadata.getClassName());
        //true 代表通过
        if (annotationMetadata.getAnnotationTypes().contains(Controller.class.getCanonicalName()))
            return true;
        return false;
    }
}

4. 定义一个配置类

在此类中主要是定义扫描那些包,然后在利用上刚刚定义的顾虑规则类

@Configuration
@ComponentScan(basePackages = {"com.hgy"}, includeFilters = {
        @ComponentScan.Filter(type = FilterType.CUSTOM, classes = {CustomFilterType.class})
}, useDefaultFilters = false)
public class MyConfiguration {
}

5. 启动类中测试

public class Entry {
    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(MyConfiguration.class);
        //获取容器中定义的bean的名称
        String[] beanDefinitionNames = context.getBeanDefinitionNames();
        System.out.println("被加入到Spring容器中的类:");
        for (String beanDefinitionName : beanDefinitionNames) {
            System.out.println(beanDefinitionName);
        }
    }
}

版权声明:本文为sui_feng_piao_guo原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。