一、作用:配置扫描@Repository、@Service、@Controller、@Component注解的类路径
二、配置扫描排除类
@Configuration @ComponentScan(value = "com.suxiaodong", excludeFilters = { @Filter(type = FilterType.ANNOTATION, classes = { Service.class }) }) public class ConfigurationBean { @Bean("person") public Person getPerson() { Person person = new Person(); person.setAge(25); person.setName("小东"); return person; } }

public static void main(String[] args) { ApplicationContext applicationContext = new AnnotationConfigApplicationContext( ConfigurationBean.class); String[] beanNames = applicationContext.getBeanDefinitionNames(); for(String beanName : beanNames) { System.out.println("beanName:" + beanName); } }
运行结果
beanName:org.springframework.context.annotation.internalConfigurationAnnotationProcessor
beanName:org.springframework.context.annotation.internalAutowiredAnnotationProcessor
beanName:org.springframework.context.annotation.internalRequiredAnnotationProcessor
beanName:org.springframework.context.annotation.internalCommonAnnotationProcessor
beanName:org.springframework.context.event.internalEventListenerProcessor
beanName:org.springframework.context.event.internalEventListenerFactory
beanName:configurationBean
beanName:personController
beanName:personRepository
beanName:person
三、只扫描指定包下指定注解类(注意useDefaultFilters = false)
@Configuration @ComponentScan(value = "com.suxiaodong", includeFilters = { @Filter(type = FilterType.ANNOTATION, classes = { Service.class }) }, useDefaultFilters = false) public class ConfigurationBean { @Bean("person") public Person getPerson() { Person person = new Person(); person.setAge(25); person.setName("小东"); return person; } }
运行结果:
beanName:org.springframework.context.annotation.internalConfigurationAnnotationProcessor
beanName:org.springframework.context.annotation.internalAutowiredAnnotationProcessor
beanName:org.springframework.context.annotation.internalRequiredAnnotationProcessor
beanName:org.springframework.context.annotation.internalCommonAnnotationProcessor
beanName:org.springframework.context.event.internalEventListenerProcessor
beanName:org.springframework.context.event.internalEventListenerFactory
beanName:configurationBean
beanName:personService
beanName:person
四、FilterType过滤规则
FilterType.ASSIGNABLE_TYPE规则
@Configuration @ComponentScan(value = "com.suxiaodong", includeFilters = { @Filter(type = FilterType.ANNOTATION, classes = { Service.class }), @Filter(type = FilterType.ASSIGNABLE_TYPE, classes = {PersonRepository.class}) }, useDefaultFilters = false) public class ConfigurationBean { @Bean("person") public Person getPerson() { Person person = new Person(); person.setAge(25); person.setName("小东"); return person; } }
五、自定义过滤规则(FilterType.CUSTOM)
@Configuration @ComponentScan(value = "com.suxiaodong", includeFilters = { @Filter(type = FilterType.CUSTOM, classes = {MyFilter.class}) }, useDefaultFilters = false) public class ConfigurationBean { @Bean("person") public Person getPerson() { Person person = new Person(); person.setAge(25); person.setName("小东"); return person; } }
public class MyFilter implements TypeFilter{ @Override public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException { AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata(); ClassMetadata classMetadata = metadataReader.getClassMetadata(); Resource resource = metadataReader.getResource(); System.out.println("className===" + classMetadata.getClassName()); if(classMetadata.getClassName().contains("Person")) { return true; } return false; } }