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容器中⾃动加载⼀个LocalValidator
FactoryBean类,因此可以直接实现数据校验。
就⽇常使⽤来说,⽐如⽀持@Valid等⼀系列校验注解。
4.数据类型转换和数据格式化
servlet和tomcat的关系< 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="t.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<ref bean="employeeConverter"/>
</set>
</property>
</bean>
</beans>
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配置⽂件\l中。
加载静态资源的三种⽅案:
①使⽤< mvc:default-servlet-handler/>。
②配置/XX /**将静态资源⽂件映射到 ResourceHttpRequestHandler 进⾏处理。
<mvc:resources mapping="/js/**" location="/js/"></mvc:resources>
<mvc:resources mapping="/css/**" location="/css/"></mvc:resources>
③激活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>
注意:如果不使⽤< 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/>了。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论