• spring-context中@ComponentScans和@ComponentScan的源码解析说明


    spring版本为5.0.11

    @ComponentScan注解默认会装配标识了@Controller,@Service,@Repository,@Component注解的类到spring容器中

    @ComponentScan源码

    /**
     * Configures component scanning directives for use with @{@link Configuration} classes.
     * Provides support parallel with Spring XML's {@code <context:component-scan>} element.
     *
     * <p>Either {@link #basePackageClasses} or {@link #basePackages} (or its alias
     * {@link #value}) may be specified to define specific packages to scan. If specific
     * packages are not defined, scanning will occur from the package of the
     * class that declares this annotation.
     *
     * <p>Note that the {@code <context:component-scan>} element has an
     * {@code annotation-config} attribute; however, this annotation does not. This is because
     * in almost all cases when using {@code @ComponentScan}, default annotation config
     * processing (e.g. processing {@code @Autowired} and friends) is assumed. Furthermore,
     * when using {@link AnnotationConfigApplicationContext}, annotation config processors are
     * always registered, meaning that any attempt to disable them at the
     * {@code @ComponentScan} level would be ignored.
     *
     * <p>See {@link Configuration @Configuration}'s Javadoc for usage examples.
     *
     * @author Chris Beams
     * @author Juergen Hoeller
     * @author Sam Brannen
     * @since 3.1
     * @see Configuration
     */
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.TYPE)//只能标注在类上
    @Documented
    @Repeatable(ComponentScans.class)
    public @interface ComponentScan {
    
        /**
         * 对应的包扫描路径 可以是单个路径,也可以是扫描的路径数组
         * Alias for {@link #basePackages}.
         * <p>Allows for more concise annotation declarations if no other attributes
         * are needed &mdash; for example, {@code @ComponentScan("org.my.pkg")}
         * instead of {@code @ComponentScan(basePackages = "org.my.pkg")}.
         */
        @AliasFor("basePackages")
        String[] value() default {};
    
        /**
         * 和value一样
         * Base packages to scan for annotated components.
         * <p>{@link #value} is an alias for (and mutually exclusive with) this
         * attribute.
         * <p>Use {@link #basePackageClasses} for a type-safe alternative to
         * String-based package names.
         */
        @AliasFor("value")
        String[] basePackages() default {};
    
        /**
         * 指定具体的扫描的类
         * Type-safe alternative to {@link #basePackages} for specifying the packages
         * to scan for annotated components. The package of each class specified will be scanned.
         * <p>Consider creating a special no-op marker class or interface in each package
         * that serves no purpose other than being referenced by this attribute.
         */
        Class<?>[] basePackageClasses() default {};
    
        /**
         * 对应的bean名称的生成器 默认的是BeanNameGenerator
         * The {@link BeanNameGenerator} class to be used for naming detected components
         * within the Spring container.
         * <p>The default value of the {@link BeanNameGenerator} interface itself indicates
         * that the scanner used to process this {@code @ComponentScan} annotation should
         * use its inherited bean name generator, e.g. the default
         * {@link AnnotationBeanNameGenerator} or any custom instance supplied to the
         * application context at bootstrap time.
         * @see AnnotationConfigApplicationContext#setBeanNameGenerator(BeanNameGenerator)
         */
        Class<? extends BeanNameGenerator> nameGenerator() default BeanNameGenerator.class;
    
        /**
         * 处理检测到的bean的scope范围
         * The {@link ScopeMetadataResolver} to be used for resolving the scope of detected components.
         */
        Class<? extends ScopeMetadataResolver> scopeResolver() default AnnotationScopeMetadataResolver.class;
    
        /**
         * 是否为检测到的组件生成代理
         * Indicates whether proxies should be generated for detected components, which may be
         * necessary when using scopes in a proxy-style fashion.
         * <p>The default is defer to the default behavior of the component scanner used to
         * execute the actual scan.
         * <p>Note that setting this attribute overrides any value set for {@link #scopeResolver}.
         * @see ClassPathBeanDefinitionScanner#setScopedProxyMode(ScopedProxyMode)
         */
        ScopedProxyMode scopedProxy() default ScopedProxyMode.DEFAULT;
    
        /**
         * 控制符合组件检测条件的类文件   默认是包扫描下的  **/*.class
         * Controls the class files eligible for component detection.
         * <p>Consider use of {@link #includeFilters} and {@link #excludeFilters}
         * for a more flexible approach.
         */
        String resourcePattern() default ClassPathScanningCandidateComponentProvider.DEFAULT_RESOURCE_PATTERN;
    
        /**
         * 是否对带有@Component @Repository @Service @Controller注解的类开启检测,默认是开启的
         * Indicates whether automatic detection of classes annotated with {@code @Component}
         * {@code @Repository}, {@code @Service}, or {@code @Controller} should be enabled.
         */
        boolean useDefaultFilters() default true;
    
        /**
         * 指定某些定义Filter满足条件的组件 FilterType有5种类型如:
                                            ANNOTATION, 注解类型 默认
                                            ASSIGNABLE_TYPE,指定固定类
                                            ASPECTJ, ASPECTJ类型
                                            REGEX,正则表达式
                                            CUSTOM,自定义类型
         * Specifies which types are eligible for component scanning.
         * <p>Further narrows the set of candidate components from everything in {@link #basePackages}
         * to everything in the base packages that matches the given filter or filters.
         * <p>Note that these filters will be applied in addition to the default filters, if specified.
         * Any type under the specified base packages which matches a given filter will be included,
         * even if it does not match the default filters (i.e. is not annotated with {@code @Component}).
         * @see #resourcePattern()
         * @see #useDefaultFilters()
         */
        Filter[] includeFilters() default {};
    
        /**
         * 排除某些过来器扫描到的类
         * Specifies which types are not eligible for component scanning.
         * @see #resourcePattern
         */
        Filter[] excludeFilters() default {};
    
        /**
         * 扫描到的类是都开启懒加载 ,默认是不开启的
         * Specify whether scanned beans should be registered for lazy initialization.
         * <p>Default is {@code false}; switch this to {@code true} when desired.
         * @since 4.1
         */
        boolean lazyInit() default false;
    
    
        /**
         * Declares the type filter to be used as an {@linkplain ComponentScan#includeFilters
         * include filter} or {@linkplain ComponentScan#excludeFilters exclude filter}.
         */
        @Retention(RetentionPolicy.RUNTIME)
        @Target({})
        @interface Filter {
    
            /**
             * The type of filter to use.
             * <p>Default is {@link FilterType#ANNOTATION}.
             * @see #classes
             * @see #pattern
             */
            FilterType type() default FilterType.ANNOTATION;
    
            /**
             * Alias for {@link #classes}.
             * @see #classes
             */
            @AliasFor("classes")
            Class<?>[] value() default {};
    
            /**
             * The class or classes to use as the filter.
             * <p>The following table explains how the classes will be interpreted
             * based on the configured value of the {@link #type} attribute.
             * <table border="1">
             * <tr><th>{@code FilterType}</th><th>Class Interpreted As</th></tr>
             * <tr><td>{@link FilterType#ANNOTATION ANNOTATION}</td>
             * <td>the annotation itself</td></tr>
             * <tr><td>{@link FilterType#ASSIGNABLE_TYPE ASSIGNABLE_TYPE}</td>
             * <td>the type that detected components should be assignable to</td></tr>
             * <tr><td>{@link FilterType#CUSTOM CUSTOM}</td>
             * <td>an implementation of {@link TypeFilter}</td></tr>
             * </table>
             * <p>When multiple classes are specified, <em>OR</em> logic is applied
             * &mdash; for example, "include types annotated with {@code @Foo} OR {@code @Bar}".
             * <p>Custom {@link TypeFilter TypeFilters} may optionally implement any of the
             * following {@link org.springframework.beans.factory.Aware Aware} interfaces, and
             * their respective methods will be called prior to {@link TypeFilter#match match}:
             * <ul>
             * <li>{@link org.springframework.context.EnvironmentAware EnvironmentAware}</li>
             * <li>{@link org.springframework.beans.factory.BeanFactoryAware BeanFactoryAware}
             * <li>{@link org.springframework.beans.factory.BeanClassLoaderAware BeanClassLoaderAware}
             * <li>{@link org.springframework.context.ResourceLoaderAware ResourceLoaderAware}
             * </ul>
             * <p>Specifying zero classes is permitted but will have no effect on component
             * scanning.
             * @since 4.2
             * @see #value
             * @see #type
             */
            @AliasFor("value")
            Class<?>[] classes() default {};
    
            /**
             * The pattern (or patterns) to use for the filter, as an alternative
             * to specifying a Class {@link #value}.
             * <p>If {@link #type} is set to {@link FilterType#ASPECTJ ASPECTJ},
             * this is an AspectJ type pattern expression. If {@link #type} is
             * set to {@link FilterType#REGEX REGEX}, this is a regex pattern
             * for the fully-qualified class names to match.
             * @see #type
             * @see #classes
             */
            String[] pattern() default {};
    
        }
    
    }

    @ComponentScans源码

    /**
     * Container annotation that aggregates several {@link ComponentScan} annotations.
     *
     * <p>Can be used natively, declaring several nested {@link ComponentScan} annotations.
     * Can also be used in conjunction with Java 8's support for repeatable annotations,
     * where {@link ComponentScan} can simply be declared several times on the same method,
     * implicitly generating this container annotation.
     *
     * @author Juergen Hoeller
     * @since 4.3
     * @see ComponentScan
     */
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.TYPE)
    @Documented
    public @interface ComponentScans {
    
        ComponentScan[] value();
    
    }
  • 相关阅读:
    java 开发webservice
    myeclipse下jsp页面汉字不能保存问题
    java web项目的部署
    Java小白手记:WEB项目等
    操作系统学习笔记:虚拟内存
    面向接口编程
    WEB端应该使用DataTable/DataSet吗?
    ExtJs grid合并单元格
    操作系统学习笔记:内存管理
    Oracle中长度为0字符串与null等价
  • 原文地址:https://www.cnblogs.com/mufeng07/p/12201483.html
Copyright © 2020-2023  润新知