1.示例代码
@Configuration //告诉Spring这是一个配置类
@ComponentScans(
value = {
@ComponentScan(value = "com.atguigu", includeFilters = {
@Filter(type = FilterType.CUSTOM, classes = {MyTypeFilter.class})
}, useDefaultFilters = false)
}
)
public class MainConfig {
//给容器中注册一个Bean;类型为返回值的类型,Bean的id默认是用方法名作为id
@Bean("person")
public Person person01() {
return new Person("lisi", 14);
}
}
2.解析
@ComponentScans样本
@ComponentScan(value = "com.atguigu",
excludeFilters = {
@Filter(type = FilterType.ANNOTATION, classes = {Controller.class, Service.class})
},
includeFilters = {
@Filter(type = FilterType.ANNOTATION, classes = {Controller.class, Service.class})
},
useDefaultFilters = false
)
规律:
测试发现:
- 1.如果只有value = “com.atguigu”,那么会扫描com.atguigu下所有的 带有@Component、@Controller、@Service、@Repository的bean
- 2.如果只有value = “com.atguigu”,useDefaultFilters = false,那么除了这个配置类(mainConfig)及这个配置类内部配置的bean(用@Bean修饰的方法),com.atguigu下其他的带有@Component、@Controller、@Service、@Repository注解的bean都不会被扫描进来
- 3.如果存在value、excludeFilters、includeFilters三个属性,会在第1种情况下,先增加includeFilters包含的bean,然后减去excludeFilters属性包含的bean
- 4.如果存在value、excludeFilters、includeFilters、useDefaultFilters = false四个属性,会在第2种情况下,先增加includeFilters包含的bean,然后减去excludeFilters包含的bean
总结:
- 1.当useDefaultFilters=true(默认也是true)扫描vlue下的所有Bean(@Component、@Controller、@Service、@Repository)
- 2.当useDefaultFilters=false时,除了当前配置类及其内部的@Bean,其Bean都不扫描
- 3.当添加includeFilters或者excludeFilters属性,则情况1或情况2(看当useDefaultFilters属性决定)基础上,先增加includeFilters指定的bean,然后去除excludeFilters指定的bean