zoukankan      html  css  js  c++  java
  • spring中注解注入 context:component-scan 的使用说明

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

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

    在注解注入之前也必须在spring的配置文件中做如下配置,我们看下spring.xml文件的内容:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
               http://www.springframework.org/schema/beans/spring-beans.xsd
               http://www.springframework.org/schema/context
               http://www.springframework.org/schema/context/spring-context-3.0.xsd">
        <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>
    
     </beans>

    这个配置文件中必须声明xmlns:context 这个xml命名空间,在schemaLocation中需要指定schema:

    http://www.springframework.org/schema/context
               http://www.springframework.org/schema/context/spring-context-3.0.xsd

    这个文件中beans根节点下只有一个context:component-scan节点,此节点有两个属性base-package属性告诉spring要扫描的包,use-default-filters=”false”表示不要使用默认的过滤器,此处的默认过滤器,会扫描包含@Service,@Component,@Repository,@Controller注解修饰的类,use-default-filters属性的默认值为true,这就意味着会扫描指定包下标有@Service,@Component,@Repository,@Controller的注解的全部类,并注册成bean。 
    所以如果仅仅是在配置文件中写<context:component-scan base-package="com.sparta.trans"/> Use-default-filter此时为true时,那么会对base-package包或者子包下所有的java类进行扫描,并把匹配的java类注册成bean。

    所以这用情况下可以发现扫描的力度还是挺大的,但是如果你只想扫描指定包下面的Controller,那该怎么办?此时子标签<context:incluce-filter>就可以发挥作用了。如下所示

    <context:component-scan base-package="com.sparta.trans.controller">
    
            <context:include-filter type="regex" expression="com.sparta.trans.[^.]+(Controller|Service)"/>
    
                     <!--  <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>  -->
    
    </context:component-scan> 

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

    注: context:component-scan节点允许有两个子节点和。filter标签的type和表达式说明如下:

    Filter TypeExamples ExpressionDescription
    annotation org.example.SomeAnnotation 符合SomeAnnoation的target class
    assignable org.example.SomeClass 指定class或interface的全名
    aspectj org.example..*Service+ AspetJ语法
    regex org.example.Default.* Regelar Expression
    custom org.example.MyTypeFilter Spring3新增自订Type,称作org.springframework.core.type.TypeFilter

    在我们的示例中,将filter的type设置成了正则表达式,regex,注意在正则里面.表示所有字符,而.才表示真正的.字符。我们的正则表示以Controller或者Service结束的类。 
    我们也可以使用annotaion来限定,如上面注释掉的所示。这里我们指定的include-filter的type是annotation,expression则是注解类的全名。

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

    <context:component-scan base-package="com.sparta.trans">  
    
    <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指定的包中有的子包是不含有注解的,所以不用扫描,此时可以指定来进行过滤,说明此包不需要被扫描。所以综上可以看出 use-dafault-filters=”false”的情况下:可以指定不需要扫描的路径来排除扫描这些文件,可以指定需要扫描的路径来进行扫描。但是由于use-dafault-filters的值默认为true,所以这一点在实际使用中还是需要注意一下的。


    @Service告诉spring容器,这是一个Service类,标识持久层Bean组件,默认情况会自动加载它到spring容器中。 
    @Autowried注解告诉spring,这个字段需要自动注入 
    @Scope指定此spring bean的scope是单例 
    @Repository注解指定此类是一个容器类,是DA层类的实现。标识持久层Bean组件 
    @Componet:基本注解,标识一个受Spring管理的Bean组件 
    @Controller:标识表现层Bean组件

    context.component-scan节点

    base-package属性告诉spring要扫描的包 
    use-default-filters=”false”表示不要使用默认的过滤器,此处的默认过滤器,会扫描包含Service,Component,Responsitory,Controller注释修饰类。

  • 相关阅读:
    Insus Meta Utility
    The 'Microsoft.ACE.OLEDB.12.0' provider is not registered on the local machine.
    Insus Binary Utility
    asp.net实现文件下载功能
    Column 'Column Name' does not belong to table Table
    程序已被编译为DLL,怎样去修改程序功能
    如何在Web网站实现搜索功能
    如何把数据流转换为二进制字符串
    Asp.net更新文件夹的文件
    如何显示中文月份
  • 原文地址:https://www.cnblogs.com/moxiaotao/p/9480082.html
Copyright © 2011-2022 走看看