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是等效的