@ComponentScan的使用原理

@ComponentScan就是根据配置的扫描路径,把符合扫描规则的类装配到spring容器中。如:https://blog.51cto.com/1754966750/1947226

注意:详细了解注解的原理看源码。

(1)、backPackages和value用于指定扫描包的路径。

(2)、basePackages:用于指定某个类的包的路径进行扫描。

(3)、nameGenerator:bean的名称生成器。

(4)、useDefaulterFilters:是否开启对@Componest,@Repository,@Service,@Controller这些类的检测,这里需要注意的是@Repository注解的含义,并且很多的时候都不会用到?因为这四种注解没有什么本质的区别,作用都是声明作用,取不同的名字只是为了区分不同的功能,

 为什么我们不用@Respository来注解接口,但是照样可以注入到这个接口的实现类,可以利用@AutoWried.

(5)、includeFilters: 包含的过滤条件

       FilterType.ANNOTATION:按照注解过滤

       FilterType.ASSIGNABLE_TYPE:按照给定的类型

       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 nameGenerator() default BeanNameGenerator.class;
 
    Class 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 {};
    }
}

转载于:https://my.oschina.net/u/4034553/blog/3040836

你可能感兴趣的:(@ComponentScan的使用原理)