(四)组件注册--@ComponentScan--Filter属性

2022-07-31,,,,

1,前言

有关@ComponentScan的Filter属性的记录

2,Filter

@ComponentScan中还有一些属性:

	//扫描的时候只扫描哪些指定的组件
    ComponentScan.Filter[] includeFilters() default {};
	//扫描的时候按照哪些规则排除指定的组件
    ComponentScan.Filter[] excludeFilters() default {};

2.1,excludeFilters

MainConfig主配置类

/**
 * 配置类==配置文件
 */
//告诉spring这是一个配置文件
@Configuration
//包扫描,value值指的是要扫描的包
@ComponentScan(value="com.cb414",excludeFilters = {
        //type= FilterType.ANNOTATION意思是按照注解来进行排除
        //也可以按照类,方法等来进行排除,只需改变type的值即可
        //classes = {Controller.class, Service.class}意思是要排除的注解的类型
        //在这里指的是排除扫描@Controller和@Service注解标注的类
        @ComponentScan.Filter(type= FilterType.ANNOTATION,classes = {Controller.class, Service.class})
})
//FilterType.ANNOTATION表示按照注解的方式进行过滤
//FilterType.ASSIGNABLE_TYPE表示按照指定的类型进行过滤
//FilterType.ASPECTJ使用ASPECTJ表达式进行过滤,但是一般不常用
//FilterType.REGEX使用正则表达式进行过滤(不常用)
//FilterType.CUSTOM表示使用自定义规则,这个自定义规则得要是TypeFilter的实现类
public class MainConfig {

    //给容器中注册一个bean,类型为返回值的类型,id为方法名
    @Bean
    public Person person(){
        return new Person("lisi",20);
    }
}

测试类

public class IOCTest {
    @Test
    public void test01(){
        AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
        //看到容器中所有定义的bean的名字
        String[] names = annotationConfigApplicationContext.getBeanDefinitionNames();
        for (String name : names) {
            System.out.println(name);
        }
    }
}

运行结果

org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalRequiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
mainConfig
bookDao
person

2.2,includeFilters

在使用 includeFilters()时,必须要先禁用掉@ComponentScan的使用默认过滤器的设置
@ComponentScan注解:

public @interface ComponentScan {

    ...

    boolean useDefaultFilters() default true;

    
    ...
        
}

所以:主配置类:

/**
 * 配置类==配置文件
 */
//告诉spring这是一个配置文件
@Configuration
//包扫描,value值指的是要扫描的包
@ComponentScan(value="com.cb414",includeFilters = {
        @ComponentScan.Filter(type= FilterType.ANNOTATION,classes = {Controller.class, Service.class})
},useDefaultFilters = false)
//FilterType.ANNOTATION表示按照注解的方式进行过滤
//FilterType.ASSIGNABLE_TYPE表示按照指定的类型进行过滤
//FilterType.ASPECTJ使用ASPECTJ表达式进行过滤,但是一般不常用
//FilterType.REGEX使用正则表达式进行过滤(不常用)
//FilterType.CUSTOM表示使用自定义规则,这个自定义规则得要是TypeFilter的实现类
public class MainConfig {

    //给容器中注册一个bean,类型为返回值的类型,id为方法名
    @Bean
    public Person person(){
        return new Person("lisi",20);
    }
}

运行结果:

org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalRequiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
mainConfig
bookController
bookService
person

2.3,自定义TypeFilter

指定过滤规则
自定义的过滤规则类

public class MyTypeFilter implements TypeFilter {
    /**
     *
     * @param metadataReader:读取到的正在扫描的类的信息
     * @param metadataReaderFactory:可以获取到的其他任何类的信息
     */
    @Override
    public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
        //获取当前类的注解的信息
        AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();
        //获取当前正在扫描的类的信息
        ClassMetadata classMetadata = metadataReader.getClassMetadata();
        //获取当前类的类名
        String className = classMetadata.getClassName();
        System.out.println("类名-->"+className);

        //获取当前类的资源信息(类的路径呀...)
        Resource resource = metadataReader.getResource();
        //如果扫描到的类名中包括er,就返回true,从而进行导入
        if(className.contains("er")){
            return true;
        }
        //返回值写的是false,也就是说一个都不匹配
        return false;
    }
}

主配置类

/**
 * 配置类==配置文件
 */
//告诉spring这是一个配置文件
@Configuration
//包扫描,value值指的是要扫描的包
@ComponentScan(value="com.cb414",includeFilters = {
        //自定义规则需要传入的是自定义规则类的类型,在这里就是MyTypeFilter的类型
        @ComponentScan.Filter(type = FilterType.CUSTOM,classes = {MyTypeFilter.class})
},useDefaultFilters = false)
//FilterType.ANNOTATION表示按照注解的方式进行过滤
//FilterType.ASSIGNABLE_TYPE表示按照指定的类型进行过滤
//FilterType.ASPECTJ使用ASPECTJ表达式进行过滤,但是一般不常用
//FilterType.REGEX使用正则表达式进行过滤(不常用)
//FilterType.CUSTOM表示使用自定义规则,这个自定义规则得要是TypeFilter的实现类
public class MainConfig {

    //给容器中注册一个bean,类型为返回值的类型,id为方法名
    @Bean
    public Person person(){
        return new Person("lisi",20);
    }
}

测试类:

public class IOCTest {
    @Test
    public void test01(){
        AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
        //看到容器中所有定义的bean的名字
        String[] names = annotationConfigApplicationContext.getBeanDefinitionNames();
        for (String name : names) {
            System.out.println(name);
        }
    }
}

运行结果:

类名-->com.cb414.IOCTest
类名-->com.cb414.bean.Person
类名-->com.cb414.config.MyTypeFilter
类名-->com.cb414.controller.BookController
类名-->com.cb414.dao.BookDao
类名-->com.cb414.MainTest
类名-->com.cb414.service.BookService
org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalRequiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
mainConfig
person
myTypeFilter
bookController
bookService

至于这里为什么有MyTypeFilter,是因为我们在主配置类中的@ComponentScan中写的是:使用自定义规则,扫描com.cb414包下面的所有类,将类名中含有er的类进行导入!

本文地址:https://blog.csdn.net/weixin_41043607/article/details/107591075

《(四)组件注册--@ComponentScan--Filter属性.doc》

下载本文的Word格式文档,以方便收藏与打印。