文档章节

<mvc:annotation-driven >和<context:component-scan>

小车车
 小车车
发布于 2016/07/07 21:42
字数 1001
阅读 104
收藏 9
  1. <mvc:annotation-driven >和<context:component-scan>的区别

         为啥要说这两个注解的区别,因为<mvc:annotation-driven >和<context:component-scan>放置的位置出错,可能就会导致项目出现404的错误。程序即不提示出错,控制台也不打印错误,这样很难排除错误。所以很有必要说明这两个注解的区别。

    2.详解

        首先我们需要了解springMVC的原理,:

运行步骤:

1、  首先用户发送请求http://localhost:9080/springmvc-chapter2/hello——>web容器,web容器根据“/hello”路径映射到DispatcherServlet(url-pattern为/)进行处理;

2、  DispatcherServlet——>BeanNameUrlHandlerMapping进行请求到处理的映射,BeanNameUrlHandlerMapping将“/hello”路径直接映射到名字为“/hello”的Bean进行处理,即HelloWorldController,BeanNameUrlHandlerMapping将其包装为HandlerExecutionChain(只包括HelloWorldController处理器,没有拦截器);

3、  DispatcherServlet——> SimpleControllerHandlerAdapter,SimpleControllerHandlerAdapter将HandlerExecutionChain中的处理器(HelloWorldController)适配为SimpleControllerHandlerAdapter;

4、  SimpleControllerHandlerAdapter——> HelloWorldController处理器功能处理方法的调用,SimpleControllerHandlerAdapter将会调用处理器的handleRequest方法进行功能处理,该处理方法返回一个ModelAndView给DispatcherServlet;

5、  hello(ModelAndView的逻辑视图名)——>InternalResourceViewResolver, InternalResourceViewResolver使用JstlView,具体视图页面在/WEB-INF/jsp/hello.jsp;

6、  JstlView(/WEB-INF/jsp/hello.jsp)——>渲染,将在处理器传入的模型数据(message=HelloWorld!)

            而<mvc:annotation-driven /> 会自动注册DefaultAnnotationHandlerMapping与AnnotationMethodHandlerAdapter 两个bean, MVC为@Controllers分发请求所必须的。
并提供了:数据绑定支持,@NumberFormatannotation支持,@DateTimeFormat支持,@Valid支持,读写XML的支持(JAXB),读写JSON的支持(Jackson)——这个是最主要的。后面,我们处理响应ajax请求时,就使用到了对json的支持。后面,对action写JUnit单元测试时,要从spring IOC容器中取DefaultAnnotationHandlerMapping与AnnotationMethodHandlerAdapter 两个bean,来完成测试,取的时候要知道是<mvc:annotation-driven />这一句注册的这两个bean。<mvc:interceptors/>会为每一个HandlerMapping,注入一个拦截器。总有一个HandlerMapping是可以找到处理器的,最多也只找到一个处理器,所以这个拦截器总会被执行的。起到了总拦截器的作用。

@Controller
public class TestController {
    
    //每一个Springmvc
    @RequestMapping(value = "/test/springmvc.do")
    public String test(String name){
    System.out.println();
        return "";
    }

        如果直接在配置文件下只有<scan>注解,或者<mvc>注解配置在<scan>后面,这样是会导致404的问题。同时就算<mvc>放在<scan>也是报404的。

        解决方法:

        @Controller
public class TestController {
    
    //每一个Springmvc
    @RequestMapping(value = "/test/springmvc.do")
    public
@Requestbody String test(String name){
    System.out.println();
        return "";
    }

      需要在方法加上@Requestbody 注解,同时<mvc>,需要配置在<scan>前面。

      为什么呢?因为根据上面的<mvc:annotation-driven />解释,主要提供数据支持。

      为了深入  <mvc:annotation-driven />的注解 ,提供了加载类,如下所示:

  • RequestMappingHandlerMapping 

  • BeanNameUrlHandlerMapping

  • RequestMappingHandlerAdapter

  • HttpRequestHandlerAdapter

  • SimpleControllerHandlerAdapter

  • ExceptionHandlerExceptionResolver 

  • ResponseStatusExceptionResolver 

  • DefaultHandlerExceptionResolver 

    上面几个Bean实例。这几个类都是用来做什么的呢?

    前两个是HandlerMapping接口的实现类,用来处理请求映射的。其中第一个是处理@RequestMapping注解的。第二个会将controller类的名字映射为请求url。

    中间三个是用来处理请求的。具体点说就是确定调用哪个controller的哪个方法来处理当前请求。第一个处理@Controller注解的处理器,支持自定义方法参数和返回值(很酷)。第二个是处理继承HttpRequestHandler的处理器。第三个处理继承自Controller接口的处理器。

    而 <context:component-scan>,在使用注解(@Component,@Repository,@Service,@Controller)配置的情况下,系统启动时会被自动扫描,并添加到bean工厂中去(省去了配置文件中写bean定义了),另外三个分别表示MVC三层模式中不同层中的组件,他们都是被@Component标记的,所以也会被自动扫描。

    

继而言之:

<context:component-scan/>标签是告诉Spring 来扫描指定包下的类,并注册被@Component,@Controller,@Service,@Repository等注解标记的组件。

    而<mvc:annotation-scan/>是告知Spring,我们启用注解驱动。然后Spring会自动为我们注册上面说到的几个Bean到工厂中,来处理我们的请求。

 

© 著作权归作者所有

共有 人打赏支持
小车车
粉丝 5
博文 94
码字总数 95384
作品 0
深圳
程序员
私信 提问
spring mvc

为什么有时候我这样设置 总是找不到action 非要这样设置才行 这个在什么情况下有用 我的是spring mvc3.2

蔡健烽
2015/06/27
266
5
用spring mvc注解,java代码还能分模块化分层吗?

现在有一个java类,用的注解,这个类放到com.yizu.controller启动不会报错,如果放到com.yizu.system.controller启动报错. 用spring mvc注解,java代码还能分模块化分层吗?...

zhang_huan
2015/09/23
274
0
Spring MVC 解读——

Spring MVC 解读——mvc:annotation-driven/ 一、AnnotationDrivenBeanDefinitionParser 通常如果我们希望通过注解的方式来进行Spring MVC开发,我们都会在***-servlet.xml中加入mvc:annotat...

麦壳原野
2014/03/05
0
8
springmvc静态资源配置没起作用

为什么我配置的 这两项都不起作用呢,通过/static/js/common.js都返回不了,所有static目录下的内容都不返回。 哪位高手帮忙看看啊

timeroading
2014/01/10
775
2
浅谈application-*.xml和springmvc-.xml的区别

项目配置说明 一般springMVC和Spring的整合过程中,我们喜欢配置两个文件application-*.xml和springmvc-.xml,但是配置不好的话,很容易出现这样的问题:Injection of resource dependencie...

小车车
2016/07/07
10
0

没有更多内容

加载失败,请刷新页面

加载更多

C++ vector和list的区别

1.vector数据结构 vector和数组类似,拥有一段连续的内存空间,并且起始地址不变。 因此能高效的进行随机存取,时间复杂度为o(1); 但因为内存空间是连续的,所以在进行插入和删除操作时,会造...

shzwork
37分钟前
2
0
Spring之invokeBeanFactoryPostProcessors详解

Spring的refresh的invokeBeanFactoryPostProcessors,就是调用所有注册的、原始的BeanFactoryPostProcessor。 相关源码 public static void invokeBeanFactoryPostProcessors(Configu......

cregu
昨天
3
0
ibmcom/db2express-c_docker官方使用文档

(DEPRECIATED) Please check DB2 Developer-C Edition for the replacement. What is IBM DB2 Express-C ? ``IBM DB2 Express-C``` is the no-charge community edition of DB2 server, a si......

BG2KNT
昨天
2
0
Ubuntu 18.04.2 LTS nvidia-docker2 : 依赖: docker-ce (= 5:18.09.0~3-0~ubuntu-bionic)

平台:Ubuntu 18.04.2 LTS nvidia-docker2 版本:2.0.3 错误描述:在安装nvidia-docker2的时候报dpkg依赖错误 nvidia-docker2 : 依赖: docker-ce (= 5:18.09.0~3-0~ubuntu-bionic) 先看一下依......

Pulsar-V
昨天
4
0
学习笔记1-goland结构体(struct)

写在前面:若有侵权,请发邮件by.su@qq.com告知。 转载者告知:如果本文被转载,但凡涉及到侵权相关事宜,转载者需负责。请知悉! 本文永久更新地址:https://my.oschina.net/bysu/blog/3036...

不最醉不龟归
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部