Spring MVC基於註解的Controller詳解

 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容器註冊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是等效的

相關文章
相關標籤/搜索