mvc:annotation-driven 注解的作用
1.自動注冊映射處理器和適配器
這是該注解的主要功能,添加< mvc:annotation-driven/>注解后,容器中會<自動注冊HandlerMapping與HandlerAdapter 兩個bean。省去手動注冊HandlerMapping和HandlerAdapter的步驟。
當配置了< mvc:annotation-driven/>后,Spring就知道了我們啟用注解驅動。然后Spring通過< context:component-scan/>標簽的配置,會自動為我們將掃描到的@Component,@Controller,@Service,@Repository等注解標記的組件注冊到工廠中,來處理我們的請求。
HandlerMapping的實現類的作用:將請求映射到帶@RequestMapping注釋的控制器方法,將URL路徑映射到控制器bean名稱。
HandlerAdapter的實現類的作用:實現類RequestMappingHandlerAdapter,處理請求的適配器,確定調用哪個類的哪個方法,并且構造方法參數,返回值。
在spring mvc 3.1以上,DefaultAnnotationHandlerMapping與AnnotationMethodHandlerAdapter對應變更為:
DefaultAnnotationHandlerMapping -> RequestMappingHandlerMapping
AnnotationMethodHandlerAdapter -> RequestMappingHandlerAdapter
AnnotationMethodHandlerExceptionResolver -> ExceptionHandlerExceptionResolver
2.映射異常處理
處理@ExceptionHandler標注的異常處理函數:在dispatcherServlet中,當用戶未注冊自定義的ExceptionResolver時,自動注冊AnnotationMethodHandlerExceptionResolver來對使用@ExceptionHandler標注的異常處理函數進行解析處理(這也導致當用戶注冊了自定義的exeptionResolver時將可能導致無法處理@ExceptionHandler)。
3.數據校驗
官方文檔解釋:“默認情況下,當在類路徑中檢測到諸如Hibernate Validator之類的Bean驗證提供程序時,使用@EnableWebMvc或<mvc:annotation-driven>會通過LocalValidatorFactoryBean在Spring MVC中自動注冊Bean驗證支持。”
要實現Hibernate Validator/JSR303 校驗(或者其他各種校驗),必須實現SpringMVC提供的一個接口:ValidatorFactory。LocalValidatorFactoryBean是ValidatorFactory的一個實現類。<mvc:annotation-driven ></mvc:annotation-driven>會在springmvc容器中自動加載一個LocalValidatorFactoryBean類,因此可以直接實現數據校驗。
就日常使用來說,比如支持@Valid等一系列校驗注解。
4.數據類型轉換和數據格式化
< mvc:annotation-driven/>支持ConversionService,可以進行常見數據類型的轉換和格式化。
ConversionService:定義了一個統一的API,用于在運行時執行類型轉換邏輯。大多數ConversionService實現還實現ConverterRegistry,該注冊器提供用于注冊轉換器的SPI。在內部,ConversionService實現委派其注冊的轉換器執行類型轉換邏輯。
ConversionService會在應用程序啟動時實例化,然后在多個線程之間共享。
在Spring應用程序中,通常會為每個Spring容器(或ApplicationContext)配置一個ConversionService實例。
FormattingConversionServiceFactoryBean:一個工廠,提供對FormattingConversionService的便捷訪問,該服務配置有用于常見類型(例如數字和日期時間)的轉換器和格式化程序。
①默認:
添加 < mvc:annotation-driven/>后,會默認創建一個ConversionService,即 FormattingConversionServiceFactoryBean。
使用FormattingConversionServiceFactoryBean可以讓SpringMVC支持@NumberFormat和@DateTimeFormat等Spring內部自定義的轉換器。
②:自定義:
默認的ConversionService可以在字符串,數字,枚舉,集合,映射和其他常見類型之間進行轉換。
如果要實現其他的類型轉換,比如將字符串 “LiHua”-23-“男” 轉換為Student實體類,可以自定義類型轉換器。
要支持自己自定義的格式器和轉換器(實現Converter,ConverterFactory或GenericConverter接口),只需自定義相應的類并加入IOC容器,然后通過設置converters屬性將自定義的轉換器注冊到ConversionService即可。
XML配置文件:
<mvc:annotation-driven conversion-service="conversionService"/><bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"><property name="converters"><set><ref bean="employeeConverter"/></set></property></bean>5.支持使用@RequestBody、@ResponseBody
這個沒什么好說的了。
6.支持靜態資源文件加載和請求映射同時使用
在配置完靜態資源訪問后,如果沒有配置< mvc:annotation-driven/>,springmvc將只能訪問靜態資源,而無法進行請求映射。
因此,有靜態資源文件需要加載的時候,一定要配置< mvc:annotation-driven/>。
< mvc:annotation-driven/>允許將DispatcherServlet映射到“ /”(從而覆蓋了容器默認Servlet的映射),同時仍允許容器默認Servlet處理靜態資源請求。 它使用URL映射“ / **”配置DefaultServletHttpRequestHandler,并且相對于其他URL映射具有最低優先級。
關于靜態資源訪問的配置:
在springmvc中,直接訪問靜態資源會404,因為之前配置的攔截器會將所有的請求通過/攔截,交給mvc的入口DispatcherServlet去匹配@RequestMapping/path,訪問不到就報錯了。
解決:如果是需要mvc處理的,則交給@RequestMapping;如果不需要mvc處理,則使用服務器(Tomcat)默認的servlet處理:對應的請求交給servlet處理,沒有對應的servlet則直接訪問。默認的servlet在Tomcat配置文件\conf/web.xml中。
加載靜態資源的三種方案:
①使用< mvc:default-servlet-handler/>。
②配置/XX /**將靜態資源文件映射到 ResourceHttpRequestHandler 進行處理。
③激活Tomcat的defaultServlet來處理靜態文件。
<servlet-mapping><servlet-name>default</servlet-name><url-pattern>*.jpg</url-pattern> </servlet-mapping> <servlet-mapping><servlet-name>default</servlet-name><url-pattern>*.js</url-pattern> </servlet-mapping> <servlet-mapping><servlet-name>default</servlet-name><url-pattern>*.css</url-pattern> </servlet-mapping>1234567891011注意:如果不使用< mvc:resources/>注冊HandlerMapping,而要設置自己的自定義HandlerMapping實例,請確保將其order屬性設置為小于DefaultServletHttpRequestHandler的Integer.MAX_VALUE的值。
因為spring 會先執行 order 值比較小的,默認的應該servlet在最后執行,以便于處理不可能進行請求映射的靜態資源訪問。
補充理解:
DefaultAnnotationHandlerMapping 的 order 屬性值是:0。
<mvc:resources/ >自動注冊的 SimpleUrlHandlerMapping 的 order 屬性值是: 2147483646。
< mvc:default-servlet-handler/>自動注冊的 SimpleUrlHandlerMapping 的 order 屬性值是:2147483647。
因此映射的順序是:注解映射——<mvc:resources/ >映射的靜態資源——< mvc:default-servlet-handler/> 兜底。
7.其他功能
啟用矩陣變量:在MVC命名空間中,<mvc:annotation-driven>元素具有應設置為true的enable-matrix-variables屬性。 默認情況下,它設置為false。
配置異步請求處理:MVC Java配置和MVC名稱空間提供用于配置異步請求處理的選項。 WebMvcConfigurer具有方法configureAsyncSupport,而<mvc:annotation-driven>具有子元素。
創建ContentNegotiationManager:在MVC命名空間中,<mvc:annotation-driven>元素具有content-negotiation-manager屬性,該屬性期望可以使用ContentNegotiationManagerFactoryBean創建ContentNegotiationManager。
數據綁定支持。
…(我應該沒說全,還有別的功能,用到的時候再說吧)
8.< mvc:annotation-driven /> 和< context:annotation-config/>的關系:
< mvc:annotation-driven />:雖然有這么多功能,但主要還是為了Spring MVC來用的,提供Controller請求轉發,json自動轉換等功能。
< context:annotation-config/>:向 Spring 容器注冊 4 個BeanPostProcessor。注冊這4個 BeanPostProcessor的作用,就是為了系統能夠識別相應的注解。常見的如:@ Resource 、@Required、@Autowired等。
不過,其實包掃描配置<context:component-scan base-package=”XX.XX”/> 也提供上述功能,因此當啟動用了包掃描就不必再配置< context:annotation-config/>了。
總結
以上是生活随笔為你收集整理的mvc:annotation-driven 注解的作用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据竞赛:记录3天进入比赛Top3%的全
- 下一篇: urlEncoder和urlDecode