博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于context:component-scan配置中use-default-filters参数的作用
阅读量:6233 次
发布时间:2019-06-22

本文共 3070 字,大约阅读时间需要 10 分钟。

参考了多篇文章都说明了use-default-filters参数的基本用途,但有些主要点没有说到,这里补充记录下:

 这个只扫描com.jaamy包下的@Controller,不会扫描@Service、@Repository

 

 这个不但扫描com.jaamy包下的@Controller,同时也会扫描@Service、@Repository,注意这里没有添加use-default-filters参数

 

下面配合源码说明下use-default-filters参数的作用以及和context:include-filter、exclude-filter的关系。

代码中是根据use-default-filters的值来确定是否需要调用registerDefaultFilters来添加默认的filters到includeFilters中,看下面的代码:

org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider

public ClassPathScanningCandidateComponentProvider(boolean useDefaultFilters, Environment environment) {        if (useDefaultFilters) {            registerDefaultFilters();        }        Assert.notNull(environment, "Environment must not be null");        this.environment = environment;    }

 

use-default-filters为true时调用了下面的代码,在includeFilters列表中添加了Component、ManagedBean和Named,因此use-default-filters的值直接影响includeFilters的内容,而includeFilters的容直接影响了要扫描的内容,因此use-default-filters的值是否配置也就决定了整体要扫描的内容。

protected void registerDefaultFilters() {        this.includeFilters.add(new AnnotationTypeFilter(Component.class));        ClassLoader cl = ClassPathScanningCandidateComponentProvider.class.getClassLoader();        try {            this.includeFilters.add(new AnnotationTypeFilter(                    ((Class
) ClassUtils.forName("javax.annotation.ManagedBean", cl)), false)); logger.debug("JSR-250 'javax.annotation.ManagedBean' found and supported for component scanning"); } catch (ClassNotFoundException ex) { // JSR-250 1.1 API (as included in Java EE 6) not available - simply skip. } try { this.includeFilters.add(new AnnotationTypeFilter( ((Class
) ClassUtils.forName("javax.inject.Named", cl)), false)); logger.debug("JSR-330 'javax.inject.Named' annotation found and supported for component scanning"); } catch (ClassNotFoundException ex) { // JSR-330 API not available - simply skip. } }

 

关于include-filter、exclude-filter的作用主要是用来过滤扫描到的bean是否合法:

首先通过exclude-filter进行黑名单过滤;

然后通过include-filter进行白名单过滤;

否则默认排除。 看下面的代码:

protected boolean isCandidateComponent(MetadataReader metadataReader) throws IOException {        for (TypeFilter tf : this.excludeFilters) {            if (tf.match(metadataReader, this.metadataReaderFactory)) {                return false;            }        }        for (TypeFilter tf : this.includeFilters) {            if (tf.match(metadataReader, this.metadataReaderFactory)) {                return isConditionMatch(metadataReader);            }        }        return false;    }

 

总结:

<context:component-scan base-package="com.jaamy"  use-default-filters="false">

         <context:include-filter type="annotation"  expression="org.springframework.stereotype.Controller" />
</context:component-scan>

针对上面的配置,use-default-filters的作用如下:

use-default-filters不配置或者是配置为true时:

不但要扫描include配置的com.jaamy包下的@Controller,而且还要扫描@Service和@Repository

use-default-filters配置为false时:

只扫描include配置的com.jaamy包下的@Controller,不扫描@Service和@Repository

 

来源: 

转载地址:http://knqna.baihongyu.com/

你可能感兴趣的文章
Element组件引发的Vue中mixins使用,写出高复用组件
查看>>
【Linux系统编程】普通用户绑定(bind)特权端口
查看>>
Django搭建个人博客:文章标签功能
查看>>
63. Unique Paths II
查看>>
989-数组形式的整数加法
查看>>
Redis 源码分析之故障转移
查看>>
React as a UI Runtime(四、条件)
查看>>
阿里云MWC 2019发布7款重磅产品,助力全球企业迈向智能化
查看>>
使用Logtail采集Kubernetes上挂载的NAS日志
查看>>
电脑录音软件哪个好,怎么用电脑录音
查看>>
《前端十年-我将一切告诉你》人物关系图
查看>>
angular js中的依赖注入是什么?
查看>>
聊聊 Array 中的坑
查看>>
修改golang源代码获取goroutine id实现ThreadLocal
查看>>
Flutter尝鲜2——动画处理<基础>
查看>>
【Redis源码分析】Redis的压缩列表ZipList
查看>>
【学习笔记】CSS深入理解之line-height
查看>>
41. 缺失的第一个正数
查看>>
【C++】 47_父子间的冲突
查看>>
[LeetCode] 694. Number of Distinct Islands
查看>>