springMVC之配置(context:component-scan) 详解

2023-05-16

<context:component-scan base-package="com.wjx.betalot" <!-- 扫描的基本包路径 -->
                        annotation-config="true" <!-- 是否激活属性注入注解 -->
                        name-generator="org.springframework.context.annotation.AnnotationBeanNameGenerator"  <!-- Bean的ID策略生成器 -->
                        resource-pattern="**/*.class" <!-- 对资源进行筛选的正则表达式,这边是个大的范畴,具体细分在include-filter与exclude-filter中进行 -->
                        scope-resolver="org.springframework.context.annotation.AnnotationScopeMetadataResolver" <!-- scope解析器 ,与scoped-proxy只能同时配置一个 -->
                        scoped-proxy="no" <!-- scope代理,与scope-resolver只能同时配置一个 -->
                        use-default-filters="false" <!-- 是否使用默认的过滤器,默认值true -->
                                  >
            <!-- 注意:若使用include-filter去定制扫描内容,要在use-default-filters="false"的情况下,不然会“失效”,被默认的过滤机制所覆盖 -->                   
            <!-- annotation是对注解进行扫描 -->
            <context:include-filter type="annotation" expression="org.springframework.stereotype.Component"/> 
            <!-- assignable是对类或接口进行扫描 -->
            <context:include-filter type="assignable" expression="com.wjx.betalot.performer.Performer"/>
            <context:include-filter type="assignable" expression="com.wjx.betalot.performer.impl.Sonnet"/>
            
            <!-- 注意:在use-default-filters="false"的情况下,exclude-filter是针对include-filter里的内容进行排除 -->
            <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
            <context:exclude-filter type="assignable" expression="com.wjx.betalot.performer.impl.RainPoem"/>
            <context:exclude-filter type="regex" expression=".service.*"/> 

</context:component-scan>

back-package:标识了<context:component-scan>元素所扫描的包,可以使用一些通配符进行配置

annotation-config:<context:component-scan>元素也完成了<context:annotation-config>元素的工作,开关就是这个属性,false则关闭属性注入注解功能

name-generator:这个属性指定你的构造型注解,注册为Bean的ID生成策略,这个生成器基于接口BeanNameGenerator实现generateBeanName方法,你可以自己写个类去自定义策略。这边,我们可不显示配置,它是默认使用org.springframework.context.annotation.AnnotationBeanNameGenerator生成器,也就是类名首字符小写的策略,如Performer类,它注册的Bean的ID为performer.并且可以自定义ID,如@Component("Joy").这边简单贴出这个默认生成器的实现。

resource-pattern:对资源进行筛选的正则表达式,这边是个大的范畴,具体细分在include-filter与exclude-filter中进行。

scoped-proxy: scope代理,有三个值选项,no(默认值),interfaces(接口代理),targetClass(类代理),那什么时候需要用到scope代理呢,举个例子,我们知道Bean的作用域scope有singleton,prototype,request,session,那有这么一种情况,当你把一个session或者request的Bean注入到singleton的Bean中时,因为singleton的Bean在容器启动时就会创建A,而session的Bean在用户访问时才会创建B,那么当A中要注入B时,有可能B还未创建,这个时候就会出问题,那么代理的时候来了,B如果是个接口,就用interfaces代理,是个类则用targetClass代理。这个例子出处:http://www.bubuko.com/infodetail-1434289.html。

scope-resolver:这个属性跟name-generator有点类似,它是基于接口ScopeMetadataResolver的,实现resolveScopeMetadata方法,目的是为了将@Scope(value="",proxyMode=ScopedProxyMode.NO,scopeName="")的配置解析成为一个ScopeMetadata对象,Spring这里也提供了两个实现,我们一起看下。首先是org.springframework.context.annotation.AnnotationScopeMetadataResolver中,

use-default-filters=”false”表示不要使用默认的过滤器,此处的默认过滤器,会扫描包含Repository@Service@Controller、 @Component、@Configuration注释修饰类。

配置完这个标签后,spring就会去自动扫描base-package对应的路径或者该路径的子包下面的java文件,如果扫描到文件中带有@Repository@Service@Controller、@Component、@Configuration等这些注解的类,则把这些类注册为bean 
注:在注解后加上例如@Component(value=”abc”)时,注册的这个类的bean的id就是adc.

注:如果配置了<context:component-scan>那么<context:annotation-config/>标签就可以不用在xml中再配置了,因为前者包含了后者。另外<context:annotation-config/>还提供了两个子标签 <context:include-filter>和 <context:exclude-filter>

 

在特殊的情况下,比如一个项目涉及到多个数据源,我们写单元测试的时候,只希望每次扫描到其中一个数据源的关系类里的 @Repository@Service@Controller、@Component、@Configuration。

 <context:component-scan > 提供两个子标签:<context:include-filter>和<context:exclude-filter>各代表 引入和排除的过滤。

这里spring 给我们提供了5种方式排除和引入扫描的类中的@Repository@Service@Controller、@Component、@Configuration。

类型举例说明
annotationorg.springframework.stereotype.Repository指定扫描中是否扫描@Repository组件
assignablecom.test.role.core.userDaoImpl指定是否扫描userDaoImpl.java这个类
aspectjcom.test.role.*通过aop方式判断所扫描的范围
regex.test.*通过正则表达式判断所扫描范围
custom自定义过滤器org.springframework.core.type.TypeFilter

context:exclude-filter

annotation:

<context:component-scan base-package="com.test.role.core" >  
    <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>  
    <!--含义是这里我们不扫描core包下所有的@Repository注解-->  
    <!--当然也可以设置为@Service、@Controller、@Component、@Configuration其中一种-->  
</context:component-scan>  

assignable:

<context:component-scan base-package="com.test.role.core" >  
    <context:exclude-filter type="assignable" expression="com.test.scan.core.UserImpl"/>  
    <!--含义是这里我们不扫描指定UserImpl类-->  
</context:component-scan>  

aspectj:

<context:component-scan base-package="com.test.role.core" >  
    <context:exclude-filter type="aspectj" expression="com.test.role..*"/>  
    <!--通过aop的方式-->  
</context:component-scan>  

regex:

<context:component-scan base-package="com.test.scan.core" >  
    <context:exclude-filter type="regex" expression="com\.sparta\.trans\.[^.]+(Controller|Service)"/>  
    <!--通过正则表达式的方式-->  
</context:component-scan>  

context:include-filter

若使用include-filter去定制扫描内容,要在use-default-filters="false"的情况下,不然会“失效”,被默认的过滤机制所覆盖 

<context:component-scan base-package="com.sparta.trans" use-default-filters="false">  
              <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>      
        </context:component-scan>

不使用默认的扫描,只扫描base-package指定下的有@Controller下的Java类,并注册成bean

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

springMVC之配置(context:component-scan) 详解 的相关文章

随机推荐

  • svn怎么切换分支

    项目场景 xff1a svn切换不成功 问题描述 怎么切换都不成功 原因分析 xff1a 解决方案 xff1a 1查看当前所在的位置 2点击switch 3to path选中需要的路径 xff0c ok就可以了 重复1步骤就能查看当前路径是
  • android studio识别不到夜神模拟器怎么办

    问题描述 xff1a 正常运行情况下 xff0c 夜神模拟器突然找不到了 xff1b 解决方案 xff1a 1 找到夜神模拟器的目录bin目录下 xff0c 路径栏中输入cmd回车 xff0c 进入控制台页面 2 执行命令 nox adb
  • Android 动态设置padding跟margin的问题

    padding view setPadding int left int top int right int bottom margin LayoutParams lp 61 LayoutParams view getLayoutParam
  • svn如何合并代码

    1 先提交本地代码 2 切换至要汇总代码的目标枝干 3 在目标枝干选择最外层的文件夹 xff0c 然后右击文件夹 merge 4 选择需要合并的分支 xff0c 和需要合并的日志 xff1b 5可以先test merge xff0c 然后选
  • android studio logcat 无日志 No connect devices

    解决 xff1a 去sdk tools中找到 google use driver xff0c 下载 xff0c 然后重启编译器 成功 连接不上夜神模拟器可以去夜神对应的bin目录下 xff0c 在目录框中输入cmd回车 输入nox adb
  • android findviewbyid 返回null

    findViewById返回Null 转自 xff1a http blog sina com cn s blog 5e58565701012q2d html 错误 xff1a findViewById返回Null xff0c 报nullpo
  • nox夜神模拟器连接不上android studio,用bat脚本快速输入命令

    不知道为什么android studio老是会识别不到夜神模拟器 xff1b 之前都是通过cmd 到夜神的bin目录下面 然后输入命令 xff0c 连接模拟器 现在发现一种更简单的做法 xff1b 1 创建一个文本文档 xff0c 改名的时
  • 微策略2017年秋招线下笔试+技术面+在线测评+主管面总结

    1 前言 微策略可能在国内的知名度比较小 xff0c 它是一家总部在美国 xff0c 在杭州设立研发中心 xff0c 主要做智能商用软件的外企 更多的信息 xff0c 请自行搜索 我是17年10月份面试微策略 xff0c 然后拿到的开发 x
  • Gradle Wrapper是什么

    Gradle提供了内置的Wrapper task帮助我们自动生成Wrapper所需要的目录文件 在一个项目中的根目录下执行 gradle wrapper即可生成 工程结构介绍 xff1a gradlew xff1a Linux下的可执行脚本
  • nginx上传文件失败,提示上传文件过大,怎么解决

    问题描述 xff1a 上传文件失败 xff0c 文件大小4M左右 上传程序为Java xff0c 通过nginx反向代理写入Fastdfs中 xff0c 但是一直失败 xff0c 查看nginx错误日志 xff0c 提示如下内容 xff1a
  • slf4j,log4j,logback之间的关系

    1 SLF4J Simple logging Facade for Java 意思为简单日志门面 xff0c 它是把不同的日志系统的实现进行了具体的抽象化 xff0c 只提供了统一的日志使用接口 xff0c 使用时只需要按照其提供的接口方法
  • 360笔试题2013

    编程题 传教士人数M xff0c 野人C xff0c M C xff0c 开始都在岸左边 xff0c 船只能载两人 xff0c 传教士和野人都会划船 xff0c 当然必须有人划船 两岸边保证野人人数不能大于传教士人数 把所有人都送过河 xf
  • 搜狗笔试题

    搜狗 xff1a 1 xff0c 有n n个正方形格子 xff0c 每个格子里有正数或者0 xff0c 从最左上角往最右下角走 xff0c 只能向下和向右走 一共走两次 xff0c 把所有经过的格子的数加起来 xff0c 求最大值 且两次如
  • WINDOWS VISTA 使用心得(二)

    WINDOWS VISTA 使用心得 xff08 二 xff09 前面谈了VISTA的版本介绍 xff0c 下面谈谈VISTA的安装 现在网上关于VISTA的文章已经很多了 xff0c 介绍也都很详细 我主要是谈谈自己安装VISTA的感受
  • 数据结构-----约瑟夫环问题

    据说著名犹太历史学家 Josephus有过以下的故事 xff1a 在罗马人占领乔塔帕特后 xff0c 39 个犹太人与Josephus及他的朋友躲到一个洞中 xff0c 39个犹太人决定宁愿死也不要被敌人抓到 xff0c 于是决定了一个自杀
  • Ubuntu错误之runitgit-daemon-runE

    使用apt install命令的错误信息如下所示 Use 39 apt get autoremove 39 to remove them 0 upgraded 0 newly installed 0 to remove and 228 no
  • E: 有未能满足的依赖关系。请尝试不指明软件包的名字来运行“apt --fix-broken install”(也可以指定一个解决办法)。

    提示 xff1a img alt src https img blog csdnimg cn 00ad6aa76f7b4b3083f5fd9dc0c5f826 png 问题描述 安装包缺少依赖关系时 xff0c 系统提示 您也许需要运行 a
  • Android7.0高级设置修改一级菜单分类和显示顺序并跳转第三方应用

    在android 盒子定制开发中 xff0c 时常会遇到需要修改高级设置Settings内容的需求 xff0c 比如在海思3798MV200方案中 xff0c 显示 菜单和 高级设置 菜单都是调整HDMI视频显示相关的设置 xff0c 但
  • Python 绘制散点图

    span class token keyword from span sklearn span class token punctuation span cluster span class token keyword import spa
  • springMVC之配置(context:component-scan) 详解

    lt context component scan base package 61 34 com wjx betalot 34 lt 扫描的基本包路径 gt annotation config 61 34 true 34 lt 是否激活属性