springboot自定义参数处理器和返回值处理器

news/2024/10/22 17:30:50/

参数处理器(ArgumentResolvers)和返回参数处理器(ReturnValueHandlers)

在我们调用controller层组件时,Springboot实际上是使用代理模式进行调用,springmvc定义了一个DispatcherServlet实现HttpServlet方法,通过DispatcherServlet的doservice()方法处理请求,在doservice方法中,springboot先根据请求的request对象生成包含对应处理此请求的必要信息的对象mapperHandler,再根据mapperHandler对象生成实际处理请求的HandlerAdapter对象,调用HandlerAdapter的handle方法真正对请求进行处理,在执行我们实际定义的处理方法代码之前和之后,HandlerAdapter会调用一些代理增强,其中就包括根据我们方法的定义来选择合适的参数处理器来将请求中的参数封装成一个个对象,拿到对象后再通过反射使用处理好的参数执行我们定义好的Controller层处理逻辑,同理在执行完实际方法之后,在选择合适的返回值处理器真正处理返回。

WebMvcConfigurationSupport这个配置类中配置了springboot默认的各种处理器

自定义处理器

对于***自定义的参数处理器,springboot提供了一个HandlerMethodArgumentResolver接口。***

自定义返回参数处理器springboot提供了一个HandlerMethodReturnValueHandler接口

通过实现上述两个接口,我们可以实现自己的自定义处理器。

springboot也有一个名为AbstractMessageConverterMethodProcessor的抽象类,这个抽象类实现了上述两个参数处理器接口和返回参数处理器接口,我们可以直接继承AbstractMessageConverterMethodProcessor抽象类重写相关方法同时实现参数处理器和返回值处理器。

  • 需要注意的是,Spring有许多默认的参数处理器,在springboot底层调用时,所有的处理器都存储在一个list集合中,使用一个for循环进行调用,谁先被循环到符合条件就调用谁,暂未找到去除自带方法处理器的方法,最好是自己定义一个注解进行标识,从而百分百生效。
  • 下面我们实现一个自定义的处理器。

自定义一个注解进行标识:

@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyAnnocation {
}

自定义一个方法处理器

@Component
public class MyProcesser extends AbstractMessageConverterMethodProcessor {protected MyProcesser(List<HttpMessageConverter<?>> converters) {super(converters);}@Overridepublic boolean supportsParameter(MethodParameter parameter) {return parameter.hasParameterAnnotation(MyAnnocation.class);}@Overridepublic Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {Bean1 bean1 = new Bean1();bean1.setName("hello world");return bean1;}//如果返回是Bean1类型就支持处理@Overridepublic boolean supportsReturnType(MethodParameter returnType) {return returnType.getMethod().getReturnType().equals(Bean1.class);}@Overridepublic void handleReturnValue(Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception {//这里是摘抄springboot默认的RequestResponseBodyMethodProcessor处理器直接返回json对象。mavContainer.setRequestHandled(true);ServletServerHttpRequest inputMessage = createInputMessage(webRequest);ServletServerHttpResponse outputMessage = createOutputMessage(webRequest);System.out.println("my handleReturnValue");// Try even with null return value. ResponseBodyAdvice could get involved.writeWithMessageConverters(returnValue, returnType, inputMessage, outputMessage);}
}

添加这个处理器到容器中

@Configuration
public class WebConfigure implements WebMvcConfigurer {private final MyProcesser myProcesser;public WebConfigure(MyProcesser myProcesser) {this.myProcesser = myProcesser;}@Overridepublic void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {resolvers.add(myProcesser);}@Overridepublic void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> handlers) {handlers.add(myProcesser);}
}

测试类

//注意这里不要直接使用RestController注解,那样的话等同于在方法前加@ResponseBody,在遍历处理器时,默认处理@ResponseBody的处理
//器RequestResponseProcesser顺序可能在我们自定义的处理器之前从而导致无法调用我们自定义的处理器。
@Controller
public class TestController {@GetMapping("/test")public Bean1 test(@MyAnnocation Bean1 bean) {return bean;}
}

http://www.ppmy.cn/news/191657.html

相关文章

初识 Arm 处理器

英国ARM公司是全球领先的半导体知识产权&#xff08;IP&#xff09;提供商。全世界超过95%的智能手机和平板电脑都采用ARM架构。ARM设计了大量高性价比、耗能低的RISC处理器、相关技术及软件。2014年基于ARM技术的全年全球出货量是120亿颗&#xff0c;从诞生到现在为止基于ARM技…

嵌入式处理器选型指南

1. 微处理器分类 根据通用计算机和嵌入式系统的分类&#xff0c;把微处理器分为&#xff1a;通用处理器 嵌入式处理器 1.通用处理器 以x86体系架构的产品为代表,目前基本为Intel和AMD两家公司所垄断。 2.嵌入式处理器 嵌入式系统领域有少量通用处理器&#xff0c;但以嵌入…

世界上计算机最好的处理器,世界上最厉害的电脑处理器是什么?

如果这里的“电脑”限定为个人计算机&#xff0c;那么最厉害的处理器&#xff0c;就绝对性能而言是Intel的酷睿i9-7980XE&#xff0c;综合考虑价格那么是AMD的锐龙ThreadRipper 1950X。 Intel一直是电脑处理器的王者&#xff0c;前些年因为AMD竞争发力&#xff0c;Intel自己也懒…

安腾处理器 oracle,英特尔展示下一代安腾处理器Poulson

英特尔即将推出的Poulson处理器将比目前安腾9300处理器具有更强的性能、更高的稳定性和更低的功耗。但目前英特尔官方拒绝透露该处理器的具体发布日期。 英特尔官方表示&#xff0c;即将推出的Poulson安腾处理器将会采用一个全新的架构&#xff0c;该架构会成为日后处理器产品的…

关于Windows10虚拟机处理器数量的问题

本人使用VMware 16.1安装了Windows 10 64位虚拟机&#xff1a; 最近发现安装的Windows 10虚拟机提示一个错误&#xff1a; 虚拟机配置使用的虚拟处理器插槽数量多于客户机所支持的数量。 对这个问题很疑惑。 按照我之前的理解&#xff0c;这里的处理器数量是CPU的核数&#x…

RIP光栅图像处理器

RIP处理器详解 文章目录 RIP处理器详解RIP的作用RIP的分类RIP的主要技术指标功能分类 RIP全称光栅图像处理器。它关系到输出的质量和速度&#xff0c;甚至整个系统的运行环境&#xff0c;可以说是彩色桌面出版系统的核心。 RIP的主要作用:将计算机制作版面中的各种图像、图形和…

大多数计算机有几个cpu,多处理器分配

多处理器是指系统中包含两台或多台功能相近的处理器,处理器之间彼此可以交换数据并独立工作。多处理器分配是指将多个处理器分配给线程或进程。现在计算机系统中,一般至少都有2个处理器,但系统中线程数目远远多于处理器数目,因此多处理器分配会采取一些分配策略。 中文名 多…

骁龙处理器哪一代产品发热控制最好?

骁龙处理器的发热控制因产品代数不同而有所差异。每一代产品都在不断提升发热控制技术&#xff0c;但是具体哪一代产品发热控制最好&#xff0c;应该根据具体的使用场景和个人喜好来判断。