作用:
    定义扫描路径,把符合扫描规则的类装配到Spring容器中。
    @ComponentScan源码:

    1. @Retention(RetentionPolicy.RUNTIME)
    2. @Target({ElementType.TYPE})
    3. @Documented
    4. @Repeatable(ComponentScans.class)
    5. public @interface ComponentScan {
    6. @AliasFor("basePackages")
    7. String[] value() default {};
    8. @AliasFor("value")
    9. String[] basePackages() default {};
    10. Class<?>[] basePackageClasses() default {};
    11. Class<? extends BeanNameGenerator> nameGenerator() default BeanNameGenerator.class;
    12. Class<? extends ScopeMetadataResolver> scopeResolver() default AnnotationScopeMetadataResolver.class;
    13. ScopedProxyMode scopedProxy() default ScopedProxyMode.DEFAULT;
    14. String resourcePattern() default "**/*.class";
    15. boolean useDefaultFilters() default true;
    16. ComponentScan.Filter[] includeFilters() default {};
    17. ComponentScan.Filter[] excludeFilters() default {};
    18. boolean lazyInit() default false;
    19. @Retention(RetentionPolicy.RUNTIME)
    20. @Target({})
    21. public @interface Filter {
    22. FilterType type() default FilterType.ANNOTATION;
    23. @AliasFor("classes")
    24. Class<?>[] value() default {};
    25. @AliasFor("value")
    26. Class<?>[] classes() default {};
    27. String[] pattern() default {};
    28. }
    29. }
    1. basePackages与value:用于指定包的路径,进行扫描。
    2. basePackageClasses:用于指定某个类的包的路径进行扫描。
    3. nameGenerator:bean的名称的生成器。
    4. useDefaultFilters:是否开启对@Component、@Repository、@Service、@Controller的类进行检测。
    5. includeFilters:包含的过滤条件。
      1. FilterType.ANNOTATION:按照注解过滤。
      2. FilterType.ASSIGNABLE_TYPE:按照给定的类型。
      3. FilterType.ASPECTJ:使用ASPECTJ表达式。
      4. FilterType.REGEX:正则。
      5. FilterType.CUSTOM:自定义规则。
    6. excludeFilters:排除的过滤条件,用法和includeFilters一样。

    代码示例:

    1. @Configuration
    2. @ComponentScan(
    3. value = "com.xxx.xxx.service",
    4. useDefaultFilters = true,
    5. basePackageClasses = HelloWorld.class,
    6. includeFilters = {
    7. @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = {Controller.class}),
    8. @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE,classes = {HelloController.class}),
    9. @ComponentScan.Filter(type = FilterType.CUSTOM, classes = {MyTypeFilter.class})
    10. }
    11. )
    12. public class Config {
    13. }
    1. public class MyTypeFilter implements TypeFilter {
    2. @Override
    3. public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
    4. String className = metadataReader.getClassMetadata().getClassName();
    5. if(className.contains("Controller")){
    6. return true;
    7. }
    8. return false;
    9. }
    10. }