zoukankan      html  css  js  c++  java
  • Spring的组件扫描注解

    通过在类上加注解 @ComponentScan 来扫描 Spring 的组件类。

    @ComponentScan 的可选参数

    • basePackages:指定需要扫描的根包目录,其子目录也会被扫描,默认路径为 @ComponentScan 注解类目录,及其子目录
    • value:basePackages 的别名
    • basePackageClasses:指定需要扫描的根类目录,其子目录也会被扫描
    • lazyInit:是否懒加载,默认 false
    • useDefaultFilters:是否启用自动扫描组件,默认 true;false 表示只应用下面指定的过滤规则
    • excludeFilters:指定不需要扫描的组件类型(详见 @Filter 配置)
    • includeFilters:指定需要扫描的组件类型(详见 @Filter 配置)
    • scopedProxy:代理模式 ScopedProxyMode
      • DEFAULT:默认,一般就是 NO
      • NO:不需要创建代理
      • INTERFACES:创建 JDK 代理
      • TARGET_CLASS:利用 CGLIB 创建代理
    • nameGenerator:指定实现了接口 BeanNameGenerator 的类,可以用来定义 BeanName 的生成规则
    • scopeResolver:指定实现了接口 AnnotationScopeMetadataResolver 的类,可以配置作用域 scope,和代理模式 scopedProxy
    • resourcePattern:用来匹配合适的组件,默认为 **/*.class,推荐使用 includeFilters 和 excludeFilters

    配置多个 @ComponentScan 的方法

    下面三种方式都可以

    @ComponentScans(
        @ComponentScan({"com.xxx.aaa","com.xxx.bbb"})
    )
    @Configuration
    public class Config {}
    
    @ComponentScan({"com.xxx.aaa","com.xxx.bbb"})
    @Configuration
    public class Config {}
    
    @ComponentScan({"com.xxx.aaa"})
    @ComponentScan({"com.xxx.bbb"})
    @Configuration
    public class Config {}
    

    配置过滤器 @Filter

    1、过滤 @Service 注解类

    @Configuration
    @ComponentScan(
        excludeFilters = {
            @Filter(type = FilterType.ANNOTATION, classes = Service.class)
        }
    )
    public class Config {}
    

    2、过滤 Dog 类

    @Configuration
    @ComponentScan(
        excludeFilters = {
            @Filter(type = FilterType.ASSIGNABLE_TYPE, classes = Dog.class)
        }
    )
    public class Config {}
    

    3、正则匹配,过滤后缀为 a 的类

    @Configuration
    @ComponentScan(
        excludeFilters = {
            @Filter(type = FilterType.REGEX, pattern = {"..*a"})
        }
    )
    public class Config {}
    

    4、自定义过滤规则类,过滤包含 a 的类

    @Configuration
    @ComponentScan(
        excludeFilters = {
            @Filter(type = FilterType.CUSTOM, classes = MyFilterType.class)
        }
    )
    public class Config {}
    // 实现 TypeFilter 自定义规则:过滤包含 a 的 BeanName
    public class MyFilterType implements TypeFilter 自定义规则 {
      @Override
      public boolean match(MetadataReader reader, MetadataReaderFactory factory) throws IOException {
        return reader.getClassMetadata().getClassName().contains("a");
      }
    }
    

    一个例子

    配置类 Config,有如下规则:

    1. 需要扫描包路径com.xxx.aaacom.xxx.bbb
    2. 排除com.xxx.aaa路径下的@Service注解类和Dog
    3. com.xxx.bbb不启用自动扫描,但是需要包含Cat
    @ComponentScan(
        value = {"com.xxx.aaa"},
        excludeFilters = {
            @Filter(type = FilterType.ANNOTATION, classes = Service.class),
            @Filter(type = FilterType.ASSIGNABLE_TYPE, classes = Dog.class)
        }
    )
    @ComponentScan(
        value = {"com.xxx.bbb"},
        useDefaultFilters = false,
        includeFilters = {
            @Filter(type = FilterType.ASSIGNABLE_TYPE, classes = Cat.class)
        }
    )
    @Configuration
    public class Config {
    }
    
  • 相关阅读:
    mac上python3安装HTMLTestRunner
    双目深度估计传统算法流程及OpenCV的编译注意事项
    深度学习梯度反向传播出现Nan值的原因归类
    1394. Find Lucky Integer in an Array
    1399. Count Largest Group
    1200. Minimum Absolute Difference
    999. Available Captures for Rook
    509. Fibonacci Number
    1160. Find Words That Can Be Formed by Characters
    1122. Relative Sort Array
  • 原文地址:https://www.cnblogs.com/bigshark/p/11286298.html
Copyright © 2011-2022 走看看