文档章节

Spring MVC基于注解的Controller详解

a
 ancle
发布于 2016/01/03 23:07
字数 1525
阅读 256
收藏 2

 一、Spring2.5之前,我们都是通过实现Controller接口或其实现(例AbstractController等)来定义我们的处理器类,不过现在已经@Deprecated

 二、Spring2.5引入注解式处理器支持,通过@Controller@RequestMapping注解定义我们的处理器类,并且提供了一组强大的注解。Spring 2.5为Spring MVC引入了注解驱动功能,也就是说无须让Controller继承任何接口无须再配置文件中定义请求和Controller的映射关系,仅仅使用一个注解可以让一个POJO具有Controller的绝大部分功能。在框架灵活性、易用性和扩展性上,Spring MVC已经全面超越了其他MVC框架。

需要通过处理器映射DefaultAnnotationHandlerMapping处理器适配器AnnotationMethodHandlerAdapter来开启支持@Controller和@RequestMapping。

 

@Service、@Repository和@Component,同@Controller注解的作用是等价的。

@Controller,标注在类定义处,使得一个POJO具有Controller的绝大部分功能

@RequestMapping,标注在类定义处,将Controller和特定请求关联起来;标注在方法签名处,进一步对请求进行分流、

@RequestParam,请求参数到处理器功能处理方法的方法参数绑定

@ModelAttribute,请求参数到命令对象的绑定

 三、Spring3.0引入RESTful架构风格(通过@PathVariable注解和其他一些特性支持),且又引入了更多的注解支持

@CookieValue,cookie数据到处理器功能处理方法的方法参数上的绑定

@RequestHeader,请求头(header)数据到处理器功能处理方法的方法参数上的绑定

@RequestBody,请求的body体的绑定(通过HttpMessageConverter进行类型转换)

@ResponseBody,处理器功能方法的返回值作为响应体(通过HTTPMessageConverter进行类型转换)

@PathVariable,请求URI中的模板变量部分到处理器功能方法的方法参数上的绑定

 四、Spring3.1使用新的HandlerMapping和HandlerAdapter来支持@Controller和@RequestMapping注解处理器

新的@Controller和@RequestMapping注解支持类:处理器映射RequestMappingHandlerMapping和处理器适配器RequestMappingHandlerAdapter组合代替2.5开始的处理器映射DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter。

 

URL路径映射:使用URL映射请求到处理器的功能处理方法

请求方法映射限定:如限制功能处理方法只处理GET请求;

请求参数映射限定:如限定只处理包含“abc”请求参数的请求;

请求头映射限定:如限定只处理“Accept=application/json”的请求

 

基于注解的Spring MVC工作设置:

    一、web.xml:启用Spring容器和Spring MVC框架   

 <!-- Spring 服务层的配置文件 -->

    <context-param>

        <param-name>contextConfigLocation</param-name>

        <param-value>

            classpath:/config/applicationContext.xml

            //classpath: /WEB-INF/classess

        </param-value>

    </context-param>


    <!-- Spring 容器启动监听器 -->

    <listener>

        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

    </listener>


    <!-- Spring MVC,默认加载/WEB-INF/dispatch-servlet.xml配置文件,以启动Spring MVC模块- -->

    <servlet>

        <servlet-name>dispatch<servlet-name>

        <servlet-class>org.springframework.web.servlet.DispatchServlet</servlet-class>

        <load-on-startup>1</load-on-startup>

    </servlet>

    <servlet-mapping>

        <servlet-name>dispatch</servlet-name>

        <url-pattern>/*</url-pattern>

    </servlet-mapping>

    二、Spring MVC配置文件(dispatch-servlet.xml)
    

<beans>

        <!-- 对controller包中的所有类进行扫描,以完成Bean创建和自动依赖注入功能 -->

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

        <!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射 -->

        <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />

        <!--  视图解析配置 -->

        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">

            <property name="viewClass" value="" />

            <property name="prefix" value="/WEB-INF/view/" />

            <property name="suffix" value=".jsp" />

        </bean>

    </beans>    

Spring MVC所有功能都建立在Bean的基础之上,所以必须事先将Controller实例化为Bean,通过类中标注@Controller并在MVC配置文件中启用组件扫描机制完成。

配置AnnotationMethodHandlerAdapter,负责根据Bean中Spring MVC注解对Bean进行加工处理,使其成为控制器并映射到特定的URL请求。

 

使用@Autowired注释

Spring2.5引入@Autowired注释,可对类成员变量、方法及构造函数进行标注,完成自动装配工作

Spring通过BeanPostProcessor对@Autowired进行解析,所以要让@Autowired起作用必须事先在Spring容器中声明AutowiredAnnotationBeanPostProcessor Bean。

<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor" />

Spring容器启动时,AutowiredAnnotationBeanPostProcessor扫描容器中所有Bean,发现Bean中用于@Autowired注释时找到并匹配对应的Bean,注入到对应的Bean中。

对成员变量使用@Autowired后,Bean中无需setter方法

默认情况下使用@Autowired注释进行自动注入时,Spring容器中匹配的候选Bean数目必须有且仅有一个。如果找不到匹配的Bean,容器将抛出BeanCreationException。

 

使用<context:annotation-config />简化配置

context的schema命名空间,对注释驱动、属性文件引入、加载期织入等功能提供了便捷的配置。

直接在Spring配置文件中定义这些Bean(AutowiredAnnotationBeanPostProcessor和CommonAnnotationBeanPostProcessor),显得比较笨拙。Spring提供了一种便捷的注册BeanPostProcessor的方式,这就是<context:annotation-config />

<context:annotation-config />隐式的向Spring容器注册AutowiredAnnotationBeanPostProcessorCommonAnnotationBeanPostProcessorPersistenceAnnotationBeanPostProcessor以及EquiredAnnotationBeanPostProcessor这4个BeanPostProcessor。

 

使用@Component

借助@Component注释,可以从XML配置文件中完全移除Bean定义的配置。仅需在类定义出,使用@Component注释就可以将一个类定义为Spring容器的Bean。

使用@Component注释后,Spring容器必须启用类扫描机制以启用注释驱动Bean定义注释驱动Bean自动注入的策略。Spring 2.5对context命名空间进行了扩展。

<context:component-scan base-package="" />,其中base-package属性指定了需要扫描的类包,类包及其子包中所有的类都会被处理。

注意

<context:componect-scan />配置不但启用了对类包进行扫描以实施注释驱动Bean定义的功能,同时还启用了注释驱动自动注入的功能(隐式地在内部注册了AutowiredAnnotationBeanPostProcessor和CommonAnnotationBeanPostProcessor),因此使用<context:component-scan />后,就可以将<context:annotation-config />移除了

 

采用具有特殊语义的注释

除@Component注释外,还有@Repository、@Service和@Controller,分别对应持久层、业务层和控制层。所有,如果Web应用程序采用经典的三层分层结构的话,最好在持久层、业务层和控制层分别采用@Repository、@Service和@Controller对分层中的类进行注释,用@Component对那些比较中立的类进行注释

注:@Repository、@Service、@Controller,和@Component是等效的

 

© 著作权归作者所有

a
粉丝 1
博文 54
码字总数 43568
作品 0
太原
私信 提问
【Spring boot实践】Spring boot下的Spring MVC

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Rsx/article/details/89194640 文章目录 Spring MVC的几种注解 Controller注解 @Controller注解是在Spring的o...

不专业得Cook
04/15
0
0
Spring MVC原理及配置详解

【spring】Spring MVC原理及配置 1.Spring MVC概述: Spring MVC是Spring提供的一个强大而灵活的web框架。借助于注解,Spring MVC提供了几乎是POJO的开发模式,使得控制器的开发和测试更加简...

qq58edf1d989a2d
2018/06/26
0
0

<mvc:annotation-driven >和context:component-scan的区别 为啥要说这两个注解的区别,因为<mvc:annotation-driven >和context:component-scan放置的位置出错,可能就会导致项目出现404的错误......

小车车
2016/07/07
171
0
SpringMVC 基于注解的Controller @RequestMapping @Request

概述 继 Spring 2.0 对 Spring MVC 进行重大升级后,Spring 2.5 又为 Spring MVC 引入了注解驱动功能。现在你无须让 Controller 继承任何接口,无需在 XML 配置文件中定义请求和 Controller...

蓝狐乐队
2014/02/28
2.2K
1
spring MVC配置详解

现在主流的Web MVC框架除了Struts这个主力 外,其次就是Spring MVC了,因此这也是作为一名程序员需要掌握的主流框架,框架选择多了,应对多变的需求和业务时,可实行的方案自然就多了。不过要...

wangxuwei
2016/01/10
138
0

没有更多内容

加载失败,请刷新页面

加载更多

3_数组

3_数组

行者终成事
今天
7
0
经典系统设计面试题解析:如何设计TinyURL(二)

原文链接:https://www.educative.io/courses/grokking-the-system-design-interview/m2ygV4E81AR 编者注:本文以一道经典的系统设计面试题:《如何设计TinyURL》的参考答案和解析为例,帮助...

APEMESH
今天
7
0
使用logstash同步MySQL数据到ES

概述   在生成业务常有将MySQL数据同步到ES的需求,如果需要很高的定制化,往往需要开发同步程序用于处理数据。但没有特殊业务需求,官方提供的logstash就很有优势了。   在使用logstas...

zxiaofan666
今天
10
0
X-MSG-IM-分布式信令跟踪能力

经过一周多的鏖战, X-MSG-IM的分布式信令跟踪能力已基本具备, 特点是: 实时. 只有要RX/TX就会实时产生信令跟踪事件, 先入kafka, 再入influxdb待查. 同时提供实时sub/pub接口. 完备. 可以完整...

dev5
今天
7
0
OpenJDK之CyclicBarrier

OpenJDK8,本人看的是openJDK。以前就看过,只是经常忘记,所以记录下 图1 CyclicBarrier是Doug Lea在JDK1.5中引入的,作用就不详细描述了,主要有如下俩个方法使用: await()方法,如果当前线...

克虏伯
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部