欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-05-18 17:41:45
1,前言有关@ComponentScan的Filter属性的记录2,Filter@ComponentScan中还有一些属性://扫描的时候只扫描哪些指定的组件 ComponentScan.Filter[] includeFilters() default {};//扫描的时候按照哪些规则排除指定的组件 ComponentScan.Filter[] excludeFilters() default {};2.1,excludeFiltersMainConfig主配置类/*...

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

相关标签: Spring