Spring context:component-scan的使用及说明

 更新时间:2023年09月25日 08:49:58   作者:郭梧悠  
这篇文章主要介绍了Spring context:component-scan的使用及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

Spring context:component-scan的使用

在xml配置了这个标签后,spring可以自动去扫描base-pack下面或者子包下面的java文件,

如果扫描到有@Component @Controller@Service等这些注解的类,则把这些类注册为bean

注意

如果配置了<context:component-scan>那么<context:annotation-config/>标签就可以不用再xml中配置了,因为前者包含了后者。

另外<context:component-scan>还提供了两个子标签

  • <context:include-filter>
  • <context:exclude-filter>

在说明这两个子标签前,先说一下<context:component-scan>有一个use-default-filters属性,该属性默认为true,这就意味着会扫描指定包下的全部的标有@Component的类,并注册成bean。

也就是@Component的子注解@Service,@Reposity等。

所以如果仅仅是在配置文件中这么写

<context:component-scan base-package="tv.huan.weisp.web"/>

Use-default-filter此时为true那么会对base-package包或者子包下的所有的进行java类进行扫描,并把匹配的java类注册成bean。

可以发现这种扫描的粒度有点太大,如果你只想扫描指定包下面的Controller,该怎么办?

此时子标签<context:incluce-filter>就起到了勇武之地。

如下所示:

<context:component-scan base-package="tv.huan.weisp.web .controller">  
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>   
</context:component-scan>  

这样就会只扫描base-package指定下的有@Controller下的java类,并注册成bean

但是因为use-dafault-filter在上面并没有指定,默认就为true,所以当把上面的配置改成如下所示的时候,就会产生与你期望相悖的结果(注意base-package包值得变化)

<context:component-scan base-package="tv.huan.weisp.web">  
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>   
</context:component-scan>  

此时,spring不仅扫描了@Controller,还扫描了指定包所在的子包service包下注解@Service的java类

此时指定的include-filter没有起到作用,只要把use-default-filter设置成false就可以了。

这样就可以避免在base-packeage配置多个包名这种不是很优雅的方法来解决这个问题了。

另外在我参与的项目中可以发现在base-package指定的包中有的子包是不含有注解了,所以不用扫描,此时可以指定<context:exclude-filter>来进行过滤,说明此包不需要被扫描。

综合以上说明

Use-dafault-filters=”false”的情况下:

  • <context:exclude-filter>指定的不扫描
  • <context:include-filter>指定的扫描

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java利用future及时获取多线程运行结果

    Java利用future及时获取多线程运行结果

    在Java编程中,有时候会需要及时获取线程的运行结果,本文就通过一个相关实例向大家介绍Java利用future及时获取线程运行结果的方法,需要的朋友可以参考。
    2017-10-10
  • springboot框架阿里开源低代码工具LowCodeEngine

    springboot框架阿里开源低代码工具LowCodeEngine

    这篇文章主要为大家介绍了springboot框架阿里开源低代码LowCodeEngine工具使用详解有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • Java日常练习题,每天进步一点点(41)

    Java日常练习题,每天进步一点点(41)

    下面小编就为大家带来一篇Java基础的几道练习题(分享)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望可以帮到你
    2021-07-07
  • java捕获AOP级别的异常并将其传递到Controller层

    java捕获AOP级别的异常并将其传递到Controller层

    如何在一个现代的Java应用中,捕获AOP(面向切面编程)级别的异常,并将这些异常传递到Controller层进行合适的处理,异常处理在构建可靠的应用程序中起着关键作用,而AOP则可以帮助我们更好地管理和组织代码,我们将深入研究如何结合AOP和异常处理来构建健壮的应用
    2023-09-09
  • JAVA 深层拷贝 DeepCopy的使用详解

    JAVA 深层拷贝 DeepCopy的使用详解

    最近需要用到比较两个对象属性的变化,其中一个是oldObj,另外一个是newObj,oldObj是newObj的前一个状态,所以需要在newObj的某个状态时,复制一个一样的对象,由于JAVA不支持深层拷贝,因此专门写了一个方法
    2013-07-07
  • jpa异常No entity found for query问题解决

    jpa异常No entity found for query问题解决

    这篇文章主要为大家介绍了jpa异常之No entity found for query的异常问题解决,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-03-03
  • springcloud nacos动态线程池Dynamic tp配置接入实战详解

    springcloud nacos动态线程池Dynamic tp配置接入实战详解

    这篇文章主要为大家介绍了springcloud nacos动态线程池Dynamic tp配置接入实战详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • Java Date与String的相互转换详解

    Java Date与String的相互转换详解

    这篇文章主要介绍了Java Date与String的相互转换详解的相关资料,需要的朋友可以参考下
    2017-02-02
  • Java中的异步非阻塞AIO模型详解

    Java中的异步非阻塞AIO模型详解

    这篇文章主要介绍了Java中的异步非阻塞AIO模型详解,AIO需要操作系统的支持,在linux内核2.6版本中加入了对真正异步IO的支持,java从jdk1.7开始支持AIO,本文提供了部分实现代码,需要的朋友可以参考下
    2023-09-09
  • Spring责任链模式使用实例讲解

    Spring责任链模式使用实例讲解

    责任链是行为型设计模式的一种,通过前一个处理者记录下一个处理者的方式形成一条处理链。客户端在调用时只需要将请求传递到责任上即可,无需关注链路中的具体的传递过程。而链路中内部的处理,是按照前一个处理者记录的下一个处理者依次执行
    2023-01-01

最新评论