@Filter
1. 作用
- 在@ComponentScan中, @Filter注解的作用是过滤出希望扫描到的组件
- @ComponentScan源码
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Documented
@Repeatable(ComponentScans.class)
public @interface ComponentScan {
ComponentScan.Filter[] includeFilters() default {};
ComponentScan.Filter[] excludeFilters() default {};
}
2. 过滤组件
excludeFilters
@Configuration
@ComponentScan(value = "com.alex", excludeFilters = {
@ComponentScan.Filter(type= FilterType.ANNOTATION, classes = Service.class)
})
public class PersonConfig {
}
3. 自定义扫描规则
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;
}
}
- excludeFilters的意思是使用MyTypeFilter, 而这个MyTypeFilter是用来排除的!!!这个很重要
- 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