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 {
    }
    
  • 相关阅读:
    eslint 翻译
    .prettierrc
    轻松掌握golang的defer机制
    golang的逃逸分析
    《python解释器源码剖析》第17章--python的内存管理与垃圾回收
    《python解释器源码剖析》第16章--python的多线程机制
    《python解释器源码剖析》第15章--python模块的动态加载机制
    MongoDB:最受欢迎的文档型数据库
    (持续更新中)opencv:处理图像的高性能模块
    (写了一点写不下去了,虽然垃圾但又不想扔)nginx--最流行的web服务器
  • 原文地址:https://www.cnblogs.com/bigshark/p/11286298.html
Copyright © 2011-2022 走看看