@ComponentScan就是根據配置的掃描路徑,把符合掃描規則的類裝配到spring容器中。如:https://blog.51cto.com/1754966750/1947226spring
注意:詳細瞭解註解的原理看源碼。.net
(1)、backPackages和value用於指定掃描包的路徑。blog
(2)、basePackages:用於指定某個類的包的路徑進行掃描。接口
(3)、nameGenerator:bean的名稱生成器。get
(4)、useDefaulterFilters:是否開啓對@Componest,@Repository,@Service,@Controller這些類的檢測,這裏須要注意的是@Repository註解的含義,而且不少的時候都不會用到?由於這四種註解沒有什麼本質的區別,做用都是聲明做用,取不一樣的名字只是爲了區分不一樣的功能,源碼
爲何咱們不用@Respository來註解接口,可是照樣能夠注入到這個接口的實現類,能夠利用@AutoWried.it
(5)、includeFilters: 包含的過濾條件io
FilterType.ANNOTATION:按照註解過濾table
FilterType.ASSIGNABLE_TYPE:按照給定的類型class
FilterType.ASPECTJ:使用ASPECTJ表達式
FilterType.REGEX:正則
FilterType.CUSTOM:自定義規則
excludeFilters: 排除的過濾條件,用法和includeFilters同樣
@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 {}; } }