加入收藏 | 设为首页 | 会员中心 | 我要投稿 厦门站长网 (https://www.0592zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

Spring的组件扫描分析

发布时间:2021-12-05 11:14:14 所属栏目:教程 来源:互联网
导读:根据济南站长网 Www.0531Zz.Com报道 通过在类上加注解 @ComponentScan 来扫描 Spring 的组件类。 @ComponentScan 的可选参数 basePackages:指定需要扫描的根包目录,其子目录也会被扫描,默认路径为 @ComponentScan 注解类目录,及其子目录 value:basePacka
根据济南站长网 Www.0531Zz.Com报道

通过在类上加注解 @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,有如下规则:
 
需要扫描包路径com.xxx.aaa、com.xxx.bbb
排除com.xxx.aaa路径下的@Service注解类和Dog类
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 {
}

(编辑:厦门站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读