The default is defer to the default behavior of the component scanner used to * execute the actual scan. *
Note that setting this attribute overrides any value set for {@link #scopeResolver}. * @see ClassPathBeanDefinitionScanner#setScopedProxyMode(ScopedProxyMode) */ ScopedProxyMode scopedProxy() default ScopedProxyMode.DEFAULT; /** * 控制符合组件检测条件的类文件 默认是包扫描下的 **/*.class * @return */ String resourcePattern() default ClassPathScanningCandidateComponentProvider.DEFAULT_RESOURCE_PATTERN; /** * 是否对带有@Component @Repository @Service @Controller注解的类开启检测,默认是开启的 * @return */ boolean useDefaultFilters() default true; /** * 指定某些定义Filter满足条件的组件 FilterType有5种类型如: * ANNOTATION, 注解类型 默认 ASSIGNABLE_TYPE,指定固定类 ASPECTJ, ASPECTJ类型 REGEX,正则表达式 CUSTOM,自定义类型 * @return */ Filter[] includeFilters() default {}; /** * 排除某些过来器扫描到的类 * @return */ Filter[] excludeFilters() default {}; /** * 扫描到的类是都开启懒加载 ,默认是不开启的 * @return */ boolean lazyInit() default false; } ``` ### a,演示basePackageClasses参数,如我们把配置文件改成如下: ``` @ComponentScan(value="com.zhang.dao",useDefaultFilters=true,basePackageClasses=UserService.class) @Configuration public class MainScanConfig { } ``` 测试结果如下: ``` mainScanConfig userDao userService ``` 只有userDao外加basePackageClasses指定的userService加入到了spring容器中 ### b,演示includeFilters参数的使用如下: 在com.zhang.service包下新建一个UserService2类如下:注意没有带@Service注解 ``` package com.zhang.service; public class UserService2 { } ``` 配置类改成: ``` @ComponentScan(value="com.zhang",useDefaultFilters=true, includeFilters={ @Filter(type=FilterType.ANNOTATION,classes={Controller.class}), @Filter(type=FilterType.ASSIGNABLE_TYPE,classes={UserService2.class}) }) @Configuration public class MainScanConfig { } ``` 运行结果如下: ``` mainScanConfig userController userDao userService userService2 ``` userService2同样被加入到了spring容器 新增一个自定义的实现了TypeFilter的MyTypeFilter类如下: ``` /** * 自定义过滤 * */ public class MyTypeFilter implements TypeFilter { 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); // 检测名字包含Service的bean if(className.contains("Service")){ return true; } return false; } } ``` 修改主配置如下: ``` @ComponentScan(value="com.zhang",useDefaultFilters=true, includeFilters={ @Filter(type=FilterType.ANNOTATION,classes={Controller.class}), @Filter(type=FilterType.CUSTOM,classes={MyTypeFilter.class}) }) @Configuration public class MainScanConfig { } ``` 运行结果如下: ``` mainScanConfig userController userDao userService userService2 ``` 可以发现同样userService2被加入到了spring容器中 好了includeFilters参数就演示到这,另外一个参数excludeFilters和includeFilters用户一摸一样,只是他是过滤出不加入spring容器中,感兴趣的同学可以自己试试,我这边就不演示了 总结一下@ComponentScan的常用方式如下 自定扫描路径下边带有@Controller,@Service,@Repository,@Component注解加入spring容器 通过includeFilters加入扫描路径下没有以上注解的类加入spring容器 通过excludeFilters过滤出不用加入spring容器的类 自定义增加了@Component注解的注解方式