@ComponentScan 的作用就是根据定义的扫描路径,把符合扫描规则的类装配到spring容器中,注解定义如下。
@Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE}) @Documented @Repeatable(ComponentScans.class) public @interface ComponentScan { @AliasFor("basePackages") String[] value() default {}; @AliasFor("value") String[] basePackages() default {}; Class<?>[] basePackageClasses() default {}; Class<? extends BeanNameGenerator> nameGenerator() default BeanNameGenerator.class; Class<? extends ScopeMetadataResolver> scopeResolver() default AnnotationScopeMetadataResolver.class; ScopedProxyMode scopedProxy() default ScopedProxyMode.DEFAULT; String resourcePattern() default "**/*.class"; boolean useDefaultFilters() default true; ComponentScan.Filter[] includeFilters() default {}; ComponentScan.Filter[] excludeFilters() default {}; boolean lazyInit() default false; @Retention(RetentionPolicy.RUNTIME) @Target({}) public @interface Filter { FilterType type() default FilterType.ANNOTATION; @AliasFor("classes") Class<?>[] value() default {}; @AliasFor("value") Class<?>[] classes() default {}; String[] pattern() default {}; } }
@Configuration @ComponentScan(basePackages = {"com.zhang"}, useDefaultFilters=true, excludeFilters ={@Filter(type=FilterType.ANNOTATION,classes={Controller.class}), @Filter(type=FilterType.ANNOTATION,classes={Service.class})})
(1)basePaceages指定了 com.zhang这个包,useDefaultFilters的值为true。如果不考虑excludeFilters ,这个两个属性组合的起来就是在 com.zhang及其子包下所有被@Component ,@Repository,@Service,@Controller这四个注解标注的类,都会被扫描并注入到Spring容器中。
(2)excludeFilters 属性指定了要排除掉被@Controller与@Service两个注解。在basePaceages与useDefaultFilters两个属性的基础上进行排除,那么最后扫描的就是 com.zhang包及其子包下的被@Component ,@Repository标记的类。
@ComponentScan(basePackages = {"com.zhang"}, useDefaultFilters=false, includeFilters ={@Filter(type=FilterType.ANNOTATION,classes={Controller.class})})
includeFilters 也是在basePackages与useDefaultFilters组合后的基础上添加一些特定的类。本例中的意思是只扫描com.zhang及其子包下被@Controller注解标记的类
spring 学习 二十 ComponentScan注解的使用
原文:https://www.cnblogs.com/cplinux/p/12456587.html