Spring注解(二) @Filter

254 阅读1分钟

@Filter

1. 作用

  • 在@ComponentScan中, @Filter注解的作用是过滤出希望扫描到的组件
  • @ComponentScan源码
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Documented
@Repeatable(ComponentScans.class) //可以叠加@ComponentScan
public @interface ComponentScan {
	// 填上需要过滤的Filter类型数组
    ComponentScan.Filter[] includeFilters() default {};
    ComponentScan.Filter[] excludeFilters() default {};

}

2. 过滤组件

excludeFilters

  • 排除Service组件
@Configuration
@ComponentScan(value = "com.alex", excludeFilters = {
        @ComponentScan.Filter(type= FilterType.ANNOTATION, classes = Service.class)
})
public class PersonConfig {
}

3. 自定义扫描规则

  • MyFilter 实现 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; // 这里是false 所以都没有过滤, 全部扫描
    }
}
  • 扫描规则
  1. excludeFilters的意思是使用MyTypeFilter, 而这个MyTypeFilter是用来排除的!!!这个很重要
  2. MyTypeFilter我没有做任何注解, 也就是它不是一个容器里的bean只是在注入的时候用来过滤的类而已
@Configuration
@ComponentScan(value = "com.alex", excludeFilters = {
        @ComponentScan.Filter(type= FilterType.CUSTOM, classes = {MyTypeFilter.class})
})
public class PersonConfig {
}
  • 结果
----->:com.alex.HelloworldApplication
----->:com.alex.config.MyTypeFilter
----->:com.alex.person.Person
15:53:04.289 [main] DEBUG org.springframework.context.annotation.ClassPathBeanDefinitionScanner - Identified candidate component class: file [/Users/michael/MyProject/源码学习/helloworld/target/classes/com/alex/person/Person.class]
----->:com.alex.person.PersonService
----->:com.alex.person.PersonServiceImpl