• context:component-scan 和 mvc:annotation-driven


    前言

    Spring MVC 框架提供了几种不同的配置元素来帮助和指示 Spring 容器管理以及注入 bean 。

    常用的几个 XML 配置是

    • context:component-scan
    • mvc:annotation-driven
    • context:annotation-config

    这些注解的功能相似又有区别,需要认真对待。

    context:component-scan

    最早的配置,从 Spring 2.5 开始引入的,它是用在 Spring 上的,自然也就可以用在 Spring MVC上。它的引入减少了 Spring 对 XML 配置文件的依赖,不必在 XML 中一个个手工配置 bean 了,也避免了每次更新都要修改 XML 的麻烦。

    <context:component-scan base-package="org.controller"/>
    

    在 Spring 应用配置文件中声明如上代码,容器将会扫描 org.controller 目录下的文件,并创建相应的实例。当然要想被创建也需要文件上添加注解,这些注解可以是

    • @Component
    • @Service
    • @Controller
    • @Repository

    除了 base-package 之外,还有一个属性是 use-default-filters 默认值是 true,表示使用默认的过滤器,这个的优先级很高,表示会扫描上述四种注解的类并注入。这时如果你在标签内配置了子标签 include-filter 的话就不会起作用,这个表示只扫描配置目录 bean。要想 include-filter 起作用,use-default-filters 就必须配置为 false,如下:

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

    使用 <context:component-scan> 的另外一个好处就是它也能解析 @Autowired 注解和 @Qualifier 注解,因此就没有使用 <context:annotation-config /> 了。

    mvc:annotation-driven

    添加该配置能够启用 Spring MVC 组件,并做一些默认配置,比如

    • 它会自动注册 HandlerMapping 和 HandlerAdapter,这两个 bean 是 Sring 为 Controller 分发请求所必须的。
    • ConversionService 取代 PropertyEditor 接口
    • 支持 @NumberFormat
    • 支持格式化日期 @DateTimeFormat (Joda)
    • 支持 @Valid,验证 @Controller (JSR-303 Provider)
    • 支持读写 XML (JAXB)
    • 支持读写 JSON(Jackson)

    要搞清楚如何做的默认配置,需要阅读文档,我们找到源码中对应的实现类是
    org.springframework.web.servlet.config.AnnotationDrivenBeanDefinitionParser
    通过阅读类注释文档,我们发现这个类主要是用来向工厂中注册了以下八个 bean :

    • RequestMappingHandlerMapping
    • BeanNameUrlHandlerMapping
    • RequestMappingHandlerAdapter
    • HttpRequestHandlerAdapter
    • SimpleControllerHandlerAdapter
    • ExceptionHandlerExceptionResolver
    • ResponseStatusExceptionResolver
    • DefaultHandlerExceptionResolver

    前两个是 HandlerMapping 接口的实现类,用来处理请求映射的。

    • 第一个是处理 @RequestMapping注解的。
    • 第二个会将 controller 类的名字映射为请求url。

    中间三个是用来处理请求的。具体说就是确定调用哪个 controller 的哪个方法来处理当前请求.

    • 第一个处理 @Controller注解的处理器,支持自定义方法参数和返回值(很酷)。
    • 第二个是处理继承 HttpRequestHandler 的处理器。
    • 第三个处理继承自 Controller 接口的处理器。
      后面三个是用来处理异常的解析器。

    context:annotation-config

    该配置是用来激活那些早就已经在 Spring 容器中存在的 bean 中的 @Autowired 和 @Qualifir 注解。

    比如有三个 bean 实例,其中一个把另外两个当做了成员,三个都已经在 Spring 的配置文件中配置了,只是依赖关系没有配置,这种情况下就可以用 context:annotation-config 了。两者缺一不可。

    <context:annotation-config />
    <bean id="beanA" class="com.example.beans.BeanA"></bean>
    <bean id="beanB" class="com.example.beans.BeanB"></bean>
    <bean id="beanC" class="com.example.beans.BeanC"></bean>
    

    以上配置等同于如下配置

    <bean id="beanA" class="com.example.beans.BeanA">
        <property name="beanB" ref="beanB"></property>
        <property name="beanC" ref="beanC"></property>
    </bean>
    <bean id="beanB" class="com.example.beans.BeanB"></bean>
    <bean id="beanC" class="com.example.beans.BeanC"></bean>
    

    context:component-scan 能做到同样的事情,并且还会多做一些事情,比如没在容器内注册的也会被它扫描到并注入。可以说 context:annotation-config 是作用域更小更集中的。

    结论

    简言之,context:component-scan是 Spring为解决 xml 配置文件过于冗长而引入的注解功能,是最全面的一个;而 mvc:annotation-driven是 Spring MVC 要起作用所必须的注解(比如 @RequestMapping等注解),一般项目中都需要两者配合使用。

  • 相关阅读:
    python3----练习......
    python3----练习题(....)
    python3----requests
    python3----练习题(爬取电影天堂资源,大学排名,淘宝商品比价)
    python3----练习题(图片转字符画)
    python3----练习题(....)
    ConfigParser 读写配置文件
    数据驱动ddt+excel数据读取
    数据驱动ddt
    expected_conditions判断页面元素
  • 原文地址:https://www.cnblogs.com/bityinjd/p/8892814.html
Copyright © 2020-2023  润新知