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 {
    }
    
  • 相关阅读:
    金丝雀发布、滚动发布、蓝绿发布到底有什么差别?关键点是什么?
    分析占用了大量 CPU 处理时间的是Java 进程中哪个线程
    阿里巴巴首部记录片问世:看哭所有创业者!
    【LBS】基于地理位置的搜索之微信 附近的人 简单实现
    【Linux】Linux 常用命令汇总
    【心灵鸡汤】为什么我会去云平台讲课
    【Mysql数据库访问利器】phpMyadmin
    【Java】一台服务器配置多个Tomcat
    tp5, laravel, yii2我该选择哪个
    网站升级2.0回滚机制
  • 原文地址:https://www.cnblogs.com/bigshark/p/11286298.html
Copyright © 2011-2022 走看看