002649:spring的context:component-scan

一、背景

  1、今天在设置项目时发现有些service和bo的实现类竟然在没有使用注解的情况下直接被使用@Autowired引用,且可正常使用   
  2、我惊呆了,根据以往的经验bean注入spring容器不是使用配置就是使用注解,今天眼前一亮。

二、使用分析

  1、component-scan的功能

    

<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:include-filter type="aspectj" expression="com.gongdao.etna..impl..*ServiceImpl"/> </context:component-scan>
    a、scan一般为需要注入spring中的类指明范围。     
    b、base-package是扫描的根目录,执行时会把这个目录下的所有class文件都加载到内存中。     
    c、use-default-filters 用于指明是否对上一步加载内存中的class筛选时使用默认过滤策略,包括component,service等注解信息,默认是true     
    d、include-filter 表示过滤式需要保留的文件,exclude-filter表示需要过滤掉的文件
    e、type 表示过滤的策略
    f、expression 表示过滤策略使用的表达式

  2、type类型

    

三、源码分析

四、结论

  1、这是一个需要了解源码实现的理由

其他

  1、component注解注入的实例都为单例,其他注解可以配合@scope来指明实例的类型。
  2、@Controller,@Repository,@Service等注解在定义时都默认引入了@Component注解

猜你喜欢

转载自www.cnblogs.com/ws563573095/p/10311849.html
今日推荐