SpringMVC中的ConversionServiceExposingInterceptor工具类解析

 更新时间:2023年12月25日 10:23:55   作者:安迪源文  
这篇文章主要介绍了SpringMVC中的ConversionServiceExposingInterceptor工具类解析,ConversionServiceExposingInterceptor是Spring MVC的一个HandlerInterceptor,用于向请求添加一个属性,需要的朋友可以参考下

概述

ConversionServiceExposingInterceptor是Spring MVC的一个HandlerInterceptor,用于向请求添加一个属性,属性名称为ConversionService.class.getName(),值是Spring MVC配置定义的一个类型转换服务。该类型转换服务会在请求处理过程中用于请求参数或者返回值的类型转换。

缺省情况下,Spring MVC配置机制会主动构建一个ConversionServiceExposingInterceptor应用于所有的请求。

关于应用

1. 引入

缺省被WebMvcConfigurationSupport启用:

// WebMvcConfigurationSupport 代码片段
// 
	/**
	 * Provide access to the shared handler interceptors used to configure
	 * {@link HandlerMapping} instances with.
	 * <p>This method cannot be overridden; use {@link #addInterceptors} instead.
	 */
	protected final Object[] getInterceptors() {
		if (this.interceptors == null) {
			InterceptorRegistry registry = new InterceptorRegistry();
			addInterceptors(registry);
			registry.addInterceptor(new ConversionServiceExposingInterceptor(mvcConversionService()));
			registry.addInterceptor(new ResourceUrlProviderExposingInterceptor(mvcResourceUrlProvider()));
			this.interceptors = registry.getInterceptors();
		}
		return this.interceptors.toArray();
	}
// requestMappingHandlerMapping() bean 定义中使用所有 getInterceptors() 定义的通用拦截器
// 		mapping.setInterceptors(getInterceptors());
// viewControllerHandlerMapping() bean 定义中使用所有 getInterceptors() 定义的通用拦截器
// 		handlerMapping.setInterceptors(getInterceptors());
// beanNameHandlerMapping() bean 定义中使用所有 getInterceptors() 定义的通用拦截器
// 		mapping.setInterceptors(getInterceptors());
// resourceHandlerMapping() bean 定义中使用所有 getInterceptors() 定义的通用拦截器
// 		handlerMapping.setInterceptors(getInterceptors());

2. 使用

DispatcherServlet#doDispatch请求处理主流程会先找到能处理该请求的Handler,以HandlerExecutionChain形式包装存在。这些HandlerExecutionChain来自某个HandlerMapping,而这些HandlerMapping就是Spring MVC配置中定义的那些HandlerMapping,它们在DispatcherServlet初始化阶段#initHandlerMappings执行时被从容器中获取。

DispatcherServlet#doDispatch得到HandlerExecutionChain之后,会调用其方法applyPreHandle以应用各个HandlerInterceptor对请求的前置处理逻辑。这其中就有ConversionServiceExposingInterceptor。

// HandlerExecutionChain 代码片段
    /**
	 * Apply preHandle methods of registered interceptors.
	 * @return {@code true} if the execution chain should proceed with the
	 * next interceptor or the handler itself. Else, DispatcherServlet assumes
	 * that this interceptor has already dealt with the response itself.
	 */
	boolean applyPreHandle(HttpServletRequest request, HttpServletResponse response) throws Exception {
		HandlerInterceptor[] interceptors = getInterceptors();
		if (!ObjectUtils.isEmpty(interceptors)) {
			for (int i = 0; i < interceptors.length; i++) {
				HandlerInterceptor interceptor = interceptors[i];
				if (!interceptor.preHandle(request, response, this.handler)) {
					triggerAfterCompletion(request, response, null);
					return false;
				}
				this.interceptorIndex = i;
			}
		}
		return true;
	}

源代码解析

源代码版本 : spring-webmvc-5.1.5.RELEASE

package org.springframework.web.servlet.handler;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.core.convert.ConversionService;
import org.springframework.util.Assert;
/**
 * Interceptor that places the configured {@link ConversionService} in request scope
 * so it's available during request processing. The request attribute name is
 * "org.springframework.core.convert.ConversionService", the value of
 * {@code ConversionService.class.getName()}.
 *
 * <p>Mainly for use within JSP tags such as the spring:eval tag.
 *
 * @author Keith Donald
 * @since 3.0.1
 */
public class ConversionServiceExposingInterceptor extends HandlerInterceptorAdapter {
	private final ConversionService conversionService;
	/**
	 * Creates a new {@link ConversionServiceExposingInterceptor}.
	 * @param conversionService the conversion service to export to request scope when this interceptor is invoked
	 */
	public ConversionServiceExposingInterceptor(ConversionService conversionService) {
		Assert.notNull(conversionService, "The ConversionService may not be null");
		this.conversionService = conversionService;
	}
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws ServletException, IOException {
       // 请求处理前向请求添加属性 
       // 属性名称使用 ConversionService.class.getName()      
		request.setAttribute(ConversionService.class.getName(), this.conversionService);
		return true;
	}
}

到此这篇关于SpringMVC中的ConversionServiceExposingInterceptor工具类解析的文章就介绍到这了,更多相关ConversionServiceExposingInterceptor工具类内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 这个Java泛型不太正经

    这个Java泛型不太正经

    这篇文章主要为大家介绍了Java泛型,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助<BR>
    2022-01-01
  • Java NIO Buffer过程详解

    Java NIO Buffer过程详解

    这篇文章主要介绍了Java NIO Buffer过程详解,缓冲区在java nio中负责数据的存储。缓冲区就是数组。用于存储不同数据类型的数据。,需要的朋友可以参考下
    2019-06-06
  • java使用Apache工具集实现ftp文件传输代码详解

    java使用Apache工具集实现ftp文件传输代码详解

    这篇文章主要介绍了java使用Apache工具集实现ftp文件传输代码详解,分享了详细连接ftp server和上传文件,下载文件的代码,以及结果展示,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • Spring中的FactoryBean与BeanFactory详细解析

    Spring中的FactoryBean与BeanFactory详细解析

    这篇文章主要介绍了Spring中的FactoryBean与BeanFactory详细解析,在Spring框架中,FactoryBean和BeanFactory是两个关键的接口,用于创建和管理对象实例,它们在Spring的IoC(Inversion of Control,控制反转)容器中发挥着重要的作用,需要的朋友可以参考下
    2023-11-11
  • org.apache.zookeeper.KeeperException.BadVersionException异常的解决

    org.apache.zookeeper.KeeperException.BadVersionException异常的解

    在使用Apache ZooKeeper进行分布式协调时,你可能会遇到org.apache.zookeeper.KeeperException.BadVersionException异常,本文就来介绍一下解决方法,感兴趣的可以了解一下
    2024-03-03
  • Java使用JDK与Cglib动态代理技术统一管理日志记录

    Java使用JDK与Cglib动态代理技术统一管理日志记录

    这篇文章主要介绍了Java使用JDK与Cglib动态代理技术统一管理日志记录,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • Spring Boot实现微信小程序登录

    Spring Boot实现微信小程序登录

    这篇文章主要为大家详细介绍了Spring Boot实现微信小程序登录,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-04-04
  • jsp页面中获取servlet请求中的参数的办法详解

    jsp页面中获取servlet请求中的参数的办法详解

    在JAVA WEB应用中,如何获取servlet请求中的参数,本文讲解了jsp页面中获取servlet请求中的参数的办法
    2018-03-03
  • Spring事务处理Transactional,锁同步和并发线程

    Spring事务处理Transactional,锁同步和并发线程

    本文详细讲解了Spring事务处理Transactional,锁同步和并发线程。对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-12-12
  • Springboot项目编译后未能加载静态资源文件的问题

    Springboot项目编译后未能加载静态资源文件的问题

    这篇文章主要介绍了Springboot项目编译后未能加载静态资源文件的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08

最新评论