前言

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等注解),一般项目中都需要两者配合使用。

context:component-scan 和 mvc:annotation-driven的更多相关文章

  1. spring3 jsp页面使用<form:form modelAttribute="xxxx" action="xxxx">报错,附连接数据库的spring MVC annotation 案例

    在写一个使用spring3 的form标签的例子时,一直报错,错误信息为:java.lang.IllegalStateException: Neither BindingResult nor plai ...

  2. [Spring Boot] Use Component Scan to scan for Bean

    Component Scan is important concept when we want to create Bean. Currently we know what, for the cla ...

  3. Caused by: java.lang.ClassNotFoundException: org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter

    严重: StandardWrapper.Throwableorg.springframework.beans.factory.BeanCreationException: Error creating ...

  4. SpringMVC配置文件详解:<context:annotation-config/>和<context:component-scan base-package=""/>和<mvc:annotation-driven />

    原文地址:https://www.cnblogs.com/lcngu/p/5080702.html Spring配置文件详解:<context:annotation-config/>和&l ...

  5. Spring 梳理-Spring配置文件 -<context:annotation-config/>和<context:component-scan base-package=""/>和<mvc:annotation-driven /> 的区别

    <context:annotation-config/> 在基于主机方式配置Spring时,Spring配置文件applicationContext.xml,你可能会见<contex ...

  6. [Spring MVC] - Annotation验证

    使用Spring MVC的Annotation验证可以直接对view model的简单数据验证,注意,这里是简单的,如果model的数据验证需要有一些比较复杂的业务逻辑性在里头,只是使用annotat ...

  7. Spring配置文件详解:<context:annotation-config/>和<context:component-scan base-package=""/>和<mvc:annotation-driven />

    <context:annotation-config/> 在基于主机方式配置Spring时,Spring配置文件applicationContext.xml,你可能会见<contex ...

  8. spring mvc 编写处理带参数的Controller

    在上一随笔记录的基础上,现记录编写处理带有参数的Controller. @Controller //这个注解会告知<context:component:scan> 将HomeControl ...

  9. RESTful Demo

    Demo 功能 两个模块, App 与 Admin, App 模块提供增加用户(/add?name=${name})与查询用户(/query/${id}), Admin 模块提供列出所有用户(/lis ...

  10. spring常用的一些注解以及注解注入总结

    常用的spring注解有如下几种: @Controller@Service@Autowired@RequestMapping@RequestParam@ModelAttribute@Cacheable ...

随机推荐

  1. oracle函数 lag()和lead()

    [语法] lag(EXPR,<OFFSET>,<DEFAULT>) LEAD(EXPR,<OFFSET>,<DEFAULT>) [功能]表示根据COL1 ...

  2. javascript简介 标签: javascript 2015-11-13 12:13 1712人阅读 评论(39)

    JavaScript是一种属于网络的脚本语言,已经被广泛用于Web应用开发,常用来为网页添加各式各样的动态功能,为用户提供更流畅美观的浏览效果.通常JavaScript脚本是通过嵌入在HTML中来实现 ...

  3. 洞见数据库前沿 阿里云数据库最强阵容 DTCC 2019 八大亮点抢先看

    摘要: 作为DTCC的老朋友和全球领先的云计算厂商,阿里云数据库团队受邀参加本次技术盛会,不仅将派出重量级嘉宾阵容,还会为广大数据库业内人士和行业用户奉上8场精彩议题.下面小编就为大家提前梳理了8大亮 ...

  4. Pytorch使用tensorboardX可视化。超详细!!!

    tensorboard --logdir runs 改为 tensorboard --logdir=D:\model\tensorboard\runs 重点 在网上看了很多方法后发现将原本链接中的计算 ...

  5. js280行代码写2048

    2048 原作者就是用Js写的,一直想尝试.但久久未动手. 昨天教学生学习JS代码.最好还是就做个有趣的游戏好了.2048这么火,是一个不错的选择. 思路: 1. 数组 ,2维数组4x4 2. 移动算 ...

  6. 枚举类型的数据存入到map中

    阅读更多 原文来自http://fokman.iteye.com/blog/1568905 public enum IdeasCMD { RESERVED(0), PING(1), PING_ACK( ...

  7. HDFS概念名称节点和数据节点-基本模型

  8. 开发者说:如何参与定义一款 IDE 插件

    摘要: If not now,when? If not you,who?共同定义 Cloud Toolkit 的未来! 自从产品经理银时小伙和他的开发小哥们在去年12月发布 Cloud Toolkit ...

  9. django 中models表的多对一,多对多的理解

    django 表的理解 好处:设计的好,会清晰,易于理解和维护,后期开发事半功倍,一目了然. 1. 一对一的表,两表的属性实际上完全可以合并成一个表,共用一个主键即可: 2. 一对多的表,可以设中间关 ...

  10. BERT大火却不懂Transformer?读这一篇就够了

    https://zhuanlan.zhihu.com/p/54356280 大数据文摘与百度NLP联合出品 编译:张驰.毅航.Conrad.龙心尘 来源:https://jalammar.github ...