1、Spring2.5以前,咱们都是经过实现Controller接口或其实现(例AbstractController等)来定义咱们的处理器类,不过如今已经@Deprecatedweb
2、Spring2.5引入注解式处理器支持,经过@Controller和@RequestMapping注解定义咱们的处理器类,而且提供了一组强大的注解。Spring 2.5为Spring MVC引入了注解驱动功能,也就是说无须让Controller继承任何接口,无须再配置文件中定义请求和Controller的映射关系,仅仅使用一个注解可让一个POJO具备Controller的绝大部分功能。在框架灵活性、易用性和扩展性上,Spring MVC已经全面超越了其余MVC框架。spring
须要经过处理器映射DefaultAnnotationHandlerMapping和处理器适配器AnnotationMethodHandlerAdapter来开启支持@Controller和@RequestMapping。json
@Service、@Repository和@Component,同@Controller注解的做用是等价的。cookie
@Controller,标注在类定义处,使得一个POJO具备Controller的绝大部分功能架构
@RequestMapping,标注在类定义处,将Controller和特定请求关联起来;标注在方法签名处,进一步对请求进行分流、mvc
@RequestParam,请求参数处处理器功能处理方法的方法参数绑定app
@ModelAttribute,请求参数到命令对象的绑定框架
3、Spring3.0引入RESTful架构风格(经过@PathVariable注解和其余一些特性支持),且又引入了更多的注解支持jsp
@CookieValue,cookie数据处处理器功能处理方法的方法参数上的绑定函数
@RequestHeader,请求头(header)数据处处理器功能处理方法的方法参数上的绑定
@RequestBody,请求的body体的绑定(经过HttpMessageConverter进行类型转换)
@ResponseBody,处理器功能方法的返回值做为响应体(经过HTTPMessageConverter进行类型转换)
@PathVariable,请求URI中的模板变量部分处处理器功能方法的方法参数上的绑定
4、Spring3.1使用新的HandlerMapping和HandlerAdapter来支持@Controller和@RequestMapping注解处理器
新的@Controller和@RequestMapping注解支持类:处理器映射RequestMappingHandlerMapping和处理器适配器RequestMappingHandlerAdapter组合代替2.5开始的处理器映射DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter。
URL路径映射:使用URL映射请求处处理器的功能处理方法
请求方法映射限定:如限制功能处理方法只处理GET请求;
请求参数映射限定:如限定只处理包含“abc”请求参数的请求;
请求头映射限定:如限定只处理“Accept=application/json”的请求
基于注解的Spring MVC工做设置:
1、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>
2、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容器注册AutowiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor、PersistenceAnnotationBeanPostProcessor以及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是等效的