Spring <context:component-scan>标签属性 use-default-filters 以及子标签 include-filter使用说明

Spring <context:component-scan>标签作用有很多,最基本就是 开启包扫描,可以使用@Component、@Service、@Component等注解;

今天要作为发现,记录该标签的属性 use-default-filters 以及子标签 include-filter使用方式 ;

use-default-filters 默认true,默认会扫描@Component、@Controller、@Service、@Repository注解,因为这些注解都可以说是@Component注解的,后面三个注解相当于是@Component注解的子类;

<xsd:attribute name="use-default-filters" type="xsd:boolean"
                default="true">
                <xsd:annotation>
                    <xsd:documentation><![CDATA[
    Indicates whether automatic detection of classes annotated with @Component, @Repository, @Service,
    or @Controller should be enabled. Default is "true".
                    ]]></xsd:documentation>
                </xsd:annotation>
            </xsd:attribute>

通常SpringWeb项目使用Spring、SpringMvc,那就会存在两个Spring容器,父子关系的容器;我们一般在SpringWeb的配置文件里开启注解扫描,我们只希望扫描Controller形式的注解;

假如存在如下包结构:

  com.xxx
        |
        |-----controller
        |
        |-----service
        

比如我会想我只扫描Controller注解的类,

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

一般来看,可能觉得没有什么问题,@Controller也扫描加入Spring容器了;但是仔细看会发现@Service、@Component、@Repository等标注的类也扫描出来的;

将use-default-filters设置为 false

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

再测试发现,果然只扫描了@Controller的注解;原因呢:

use-default-filters="false"的时候,在设置<context:include-filter/> 相当于加白名单 ,我只会扫描你允许扫描的注解,就像QQ好友聊天设置了只和好友聊天,不是好友的不能发消息给我;

或者     use-default-filters="true"的时候,在设置<context:exclude-filter/>  相当于加黑名单 ,(上面四种注解@Component、@Service、@Controller、@Repository我都会扫描,至于哪些不要了你说了算,打个比方,QQ上的黑名单,你可以和好友列表中好友聊天,但是不能和黑名单里的发消息吧,差不多这个意思,反正我好久没用过黑名单了。。。

当然了,也可以设置扫描包级别细分到com.xxx.controller,严格按照包定义来扫描,也不会任何问题;

包扫描不严格会导致的问题,Spring事务失效的问题,甚至还会有其他各种问题出现,比如Spring容器、SpringMvc容器都扫描到Service层,这时候父子容器都有Service的bean了,默认先在本容器查找,再去父亲容器查找,两个bean能一样嘛?一个AOP动态代理后的,一个原生态的bean,这时候就会出现事务失效问题,后面会模拟记录下这个问题的;

原文地址:https://www.cnblogs.com/lvbinbin2yujie/p/10308363.html

时间: 2024-10-29 19:08:52

Spring <context:component-scan>标签属性 use-default-filters 以及子标签 include-filter使用说明的相关文章

自定义标签TLD文件中,rtexprvalue子标签的意思

rtexprvalue的全称是 Run-time Expression Value, 它用于表示是否能够利用JSP表达式. 举例子: 1.定义一个TLD文件: <tag> <name>selectDetail</name> <tag-class>com.nms.taglib.SelectDetail_Tag</tag-class> <body-content>JSP</body-content> <attribute

jQuery 获取标签属性值的问题

jquery attr()无法获取属性值问题 css里明明已经设置过了: 可还是获取不了: 求指导. 一定是undefined,attr是用来获得或设置标签属性的,不是用来获得CSS属性的.如果你有id是nn1的标签,可以用ww=$("#nn1").css("top");来获得CSS属性. 标签属性和css属性怎么区别 追答 <script type="text/javascript"> $(document).ready(funct

JavaScript中DOM操作之设定标签属性

一.标签属性值的设定和获取 标签对象.steAttribute('属性名称',属性值):一次只能定义一个,如果要定义多个,需要多次执行获取标签属性值标签对象.getAttribute('属性名称');获取的结果都是字符串 //获取所有div的标签 var oDiv1 = document.querySelector('div'); //并且将属性设置为index=0 oDiv1.setAttribute('index',0); //输出设定后的结果 console.log( oDiv1 ); /

Spring事务配置的五种方式和spring里面事务的传播属性和事务隔离级别

转: http://blog.csdn.net/it_man/article/details/5074371 Spring事务配置的五种方式 前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识.通过这次的学习发觉Spring的事务配置只要把思路理清,还是比较好掌握的. 总结如下: Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource.TransactionManager和代理机制这三部分,无论哪

【转】 Spring事务配置的五种方式和spring里面事务的传播属性和事务隔离级别

spring事务配置的五种方式 前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识.通过这次的学习发觉Spring的事务配置只要把思路理清,还是比较好掌握的. 总结如下: Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource.TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分. DataSource.TransactionManager这两部分

Spring注解@Component、@Repository、@Service、@Controller区别

Spring注解@Component.@Repository.@Service.@Controller区别 Spring 2.5 中除了提供 @Component 注释外,还定义了几个拥有特殊语义的注释,它们分别是:@Repository.@Service 和 @Controller.在目前的 Spring 版本中,这 3 个注释和 @Component 是等效的,但是从注释类的命名上,很容易看出这 3 个注释分别和持久层.业务层和控制层(Web 层)相对应.虽然目前这 3 个注释和 @Comp

spring &lt;context:component-scan&gt;(转)

在xml配置了这个标签后,spring可以自动去扫描base-pack下面或者子包下面的java文件,如果扫描到有@Component @[email protected]等这些注解的类,则把这些类注册为bean 注意:如果配置了<context:component-scan>那么<context:annotation-config/>标签就可以不用再xml中配置了,因为前者包含了后者.另外<context:annotation-config/>还提供了两个子标签 1.

Spring &lt;context:component-scan&gt;说明

在spring-context.xml配置该标签后,spring会自动去扫描base-pack下面或者子包下面的Java文件,如果扫描到有@Component @[email protected]等这些注解的类,则把这些类注册为bean,放入Ioc容器中. 注意:如果配置了<context:component-scan>那么<context:annotation-config/>标签就可以不用再xml中配置了,因为前者包含了后者.另外<context:component-sc

spring &lt;context:component-scan&gt;使用说明(转)

在xml配置了这个标签后,spring可以自动去扫描base-pack下面或者子包下面的java文件,如果扫描到有@Component @[email protected]等这些注解的类,则把这些类注册为bean 注意:如果配置了<context:component-scan>那 么<context:annotation-config/>标签就可以不用再xml中配置了,因为前者包含了后者.另 外<context:annotation-config/>还提供了两个子标签