一、作用:配置扫描@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;
    }
}