@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 {}; } }