自定义HandlerMethodArgumentResolver如何注册到springmvc框架里的

news2024/12/23 17:56:29

目录

1.DEBUG 注册代码

1.1 WebMvcConfigurerComposite

1.2 DelegatingWebMvcConfiguration

 1.3 AutowiredAnnotationBeanPostProcessor

2.DEBUG调用代码

2.1 this.argumentResolvers


日常工作开发中,总有一些参数,在未传参数时,需要自定义一些参数。

 比如

@DefaultValueIfNull("1000")

未传值时,默认加1000,用字符串是因为以后想要匹配更多类型。

这时候需要定义一个 HandlerMethodArgumentResolver 

@Component
public class DefaultValueIfNullResolver  implements HandlerMethodArgumentResolver {

    /**
     * 对参数进行默认操作,如果为空值,那么就需要进行特殊操作了
     **/
    private RequestParamMethodArgumentResolver argumentResolver = new RequestParamMethodArgumentResolver(false);

    /**
     * 是否有这个注解
     * @author      
     * @date        2022-12-05 17:47
     **/
    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        return parameter.hasParameterAnnotation(DefaultValueIfNull.class);
    }

    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
        // 1. 获取到 request 对象
        HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);
        String name = parameter.getParameter().getName();
        // 2.

        // 得到 DefaultValueIfNull 注解,对注解进行分析,然后操作
        DefaultValueIfNull defaultValueIfNull = parameter.getParameterAnnotation(DefaultValueIfNull.class);

        /** 获取是什么类型的属性 **/
        Class<?> type1 = parameter.getParameter().getType();
        String value = defaultValueIfNull.value();
        Class type = defaultValueIfNull.type();



        return null;
    }
}

注意,上面代码并没有完成,只是作为示例。

这时候就有一个疑问,这个自定义的resolver是如何添加到spring mvc框架里的。

当然,我们需要进行配置。

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Autowired
    private DefaultValueIfNullResolver resolver;

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
        resolvers.add(resolver);
    }
}

1.DEBUG 注册代码

 

1.1 WebMvcConfigurerComposite

 类路径 

org.springframework.web.servlet.config.annotation.WebMvcConfigurerComposite


将 WebMvcConfigurer的各种实现类,放到 delegates里

继续向下

1.2 DelegatingWebMvcConfiguration

org.springframework.web.servlet.config.annotation.DelegatingWebMvcConfiguration

可以看到,这里是使用Spring容器进行操作的

 

 1.3 AutowiredAnnotationBeanPostProcessor

org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor

这个类的的结构图,参看下列 

QQ图片20200423112050.png

 AutowiredAnnotationBeanPostProcessor实现了BeanPostProcessor接口,当 Spring 容器启动时,AutowiredAnnotationBeanPostProcessor 将扫描 Spring 容器中所有 Bean,当发现 Bean 中拥有@Autowired 注解时就找到和其匹配(默认按类型匹配)的 Bean,并注入到对应的地方中去。先来看下buildAutowiringMetadata方法

这是正常的生命周期操作。

到了第一步,就知道已经注册到容器里,但是自定义resolver是何时调用的呢 ?

那么需要关注

DelegatingWebMvcConfiguration

2.DEBUG调用代码

org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport

在 WebMvcConfigurationSupport 这个配置类,可以看到 

RequestMappingHandlerAdapter

这个方法,返回了一个handlerAdapter,在这里进行了操作。

2.1 this.argumentResolvers

进入这个方法,可以看到初始化的操作。

 下面进入  addArgumentResolvers

这个 this.configurers 在 [ 1.2 DelegatingWebMvcConfiguration ]

看类型继承,可以看到

DelegatingWebMvcConfiguration 的大部分配置都是在父类 WebMvcConfigurationSupport 里进行定义了,这也是典型的模板方法。

我们继续进入到

addArgumentResolvers

内部方法里。

关于  this.delegates 查看 1.1 WebMvcConfigurerComposite

 这里实际上是调用了WebMvcConfigurer的实现类的  addArgumentResolvers方法。

也就是自定义WebMvcConfig里面的代码。

List<HandlerMethodArgumentResolver> resolvers  具体看 2.1 this.argumentResolvers

 最终 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/65821.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

零编程制作疫情全国行政区地图,理性看待各地疫情防控减码

1 前言 北京宣布&#xff0c;12月5日首班车起&#xff0c;公交、地铁不得拒绝无48小时核酸阴性证明的乘客乘车。 上海宣布&#xff0c;12月5日零时起&#xff0c;乘坐地铁、公交、轮渡&#xff0c;不再查验核酸检测阴性证明。 杭州和宁波深夜发布&#xff0c;12月5日起&…

Stable Diffusion8

也写到第八了 ~~ 这次还是和mac相关哦~~ 先吹吹,苹果亲自下场优化&#xff0c;在iPhone、iPad、Mac等设备上以惊人的速度运行Stable Diffusion就是这么简单。 输入一句话就能生成图像的 Stable Diffusion 已经火爆数月。它是一个开源模型&#xff0c;而且在消费级 GPU 上就能…

如何配置settings.py文件

文章目录配置settings.py文件1) 修改语言与时区配置2) 设置时区不敏感3) 配置项目所需数据库4&#xff09;学会阅读报错信息配置settings.py文件 《settings.py配置文件&#xff08;详解&#xff09;》一文中&#xff0c;将 settings.py 配置文件的每一项给大家做了介绍。在开…

Matplotlib入门[03]——处理文本

Matplotlib入门[03]——处理文本 参考&#xff1a; https://ailearning.apachecn.org/Matplotlib官网Python 字符串前缀r、u、b、f含义 使用Jupyter进行练习 import matplotlib.pyplot as plt import numpy as np处理文本-基础 基础文本函数 在 matplotlib.pyplot 中&#xf…

服务访问质量(QoS)介绍与技术 二

个人简介&#xff1a;云计算网络运维专业人员&#xff0c;了解运维知识&#xff0c;掌握TCP/IP协议&#xff0c;每天分享网络运维知识与技能。个人爱好: 编程&#xff0c;打篮球&#xff0c;计算机知识个人名言&#xff1a;海不辞水&#xff0c;故能成其大&#xff1b;山不辞石…

基于双参数蜜蜂算法解决车辆路径问题(Matlab代码实现)

目录 1 概述 1.1研究背景 2 运行结果 3 Matlab代码实现 4 参考文献 1 概述 群智能起源于自然环境中生物群体经过长期自然进化后具有的解决问题的能力,其中的许多问题在人类看来可以归属于高复杂度的优化问题。受到生态系统中一些具有社会群体特征的物种的行为启发,模仿自然…

python基础项目实战-简单版学生管理系统

我实现的学生管理系统主要涉及到的就是其中的增、删、改、查、显示、保存和退出这几个功能,分别将每一个功能单独用一个函数来实现的。 一、学生系统操作的主界面 二、学生系统主函数调用功能选项 三、学生系统学员的显示 四、学生系统学员的查找

window11安装docker小白教程

window11安装docker小白详细教程1、安装hyper-v2、安装wsl23、安装docker并初步运行1、安装hyper-v docker的运行依赖于linux内核&#xff0c;如果是windows的系统则需要安装一个运行linux的虚拟机。在window10及其以上的系统中可以安装hyper-v&#xff08;Hyper-V 是微软开发…

A股交易接口如何用c++实现查询股东代码的?

A股交易接口是投资者获取股票市场数据的一个工具&#xff0c;使用A股交易接口能够得到更多更准确的信息&#xff0c;让你在股市当中&#xff0c;操作起来更加便捷和有效&#xff0c;对股市市场行情动向判断更加的准确一些。 股票交易接口支持各类数据的查询&#xff0c;那么今…

实现主成分分析 (PCA) 和独立成分分析 (ICA) (Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

面试题: LEAD 和 LAG 求每个用户的页面停留时长

我们先来看看这两个函数的语法&#xff1a; LEAD(col,n,default) OVER() 说明&#xff1a; 用于统计窗口内向下第n行的值参数1&#xff1a; 为要取值的列名参数2&#xff1a; 为向下第n行&#xff0c;默认值为1&#xff0c;这个值是固定的&#xff0c;不能动态的变化参数3&am…

Redis事务、pub/sub、PipeLine-管道、benchmark性能测试详解

一. 事务 1. 概念补充 (1). 原子性 一个事务(transaction)中的所有操作&#xff0c;要么全部完成&#xff0c;要么全部不完成&#xff0c;不会结束在中间某个环节。事务在执行过程中发生错误&#xff0c;会被恢复(Rollback)到事务开始前的状态&#xff0c;就像这个事务从来没…

SpringCloud Alibaba学习笔记,记重点!!

SpringCloud Alibaba入门简介 Spring Cloud Netflix 项目进入维护模式&#xff0c;Spring Cloud Netflix 将不再开发新的组件。Spring Cloud 版本迭代算是比较快的&#xff0c;因而出现了很多重大 ISSUE 都还来不及 Fix 就又推另一个 Release 了。进入维护模式意思就是目前一直…

深入了解- TCP拥塞状态机 tcp_fastretrans_alert

【推荐阅读】 浅析linux内核网络协议栈--linux bridge virtio-net 实现机制【一】&#xff08;图文并茂&#xff09; 深入理解SR-IOV和IO虚拟化 这里主要说的是TCP拥塞情况下的状态状态处理 /* Process an event, which can update packets-in-flight not trivially.* Main go…

投资者该如何看待股票接口?

大部分做量化的投资者都会使用股票接口或者量化平台来协助交易&#xff0c;我们应该怎样去看待这些工具呢&#xff1f; 首先&#xff0c;如果我们要做量化&#xff0c;肯定是需要一个靠谱的股票接口去协助自己的&#xff0c;不然只靠人工是无法达到程序化交易的目的的&#xff…

使用gitlab的cicd自动化部署vue项目shell流程踩坑之路

强烈建议&#xff1a;先在部署的服务器上手动跑一边流程 包括&#xff1a;&#xff08;服务器上要安装node、npm、git等依赖&#xff09; 1. git clone 仓库地址 2. npm install / yarn 安装依赖 3. cp -rf dist/ /var/www/html 如果以上步骤都没有出错&#xff0c;那再安…

自从面试了一个测试岗00后卷王,老油条感叹真干不过,但是...

周末和技术大佬们聚餐&#xff0c;聊到了测试行业的“金九银十”高峰就业问题&#xff0c;普遍认为转行和大学生入行的越来越多&#xff0c;内卷之势已然形成。 现在不论面试哪个级别的测试工程师&#xff0c;面试官都会问一句 “会编程吗&#xff1f;有没有自动化测试的经验&…

当线下门店遇上AI:华为云ModelBox携手佳华科技客流分析实践

摘要&#xff1a;在赋能传统门店客流经营数字化转型方面&#xff0c;华为云ModelBox与伙伴佳华科技合作推出的“华为云客流统计项目”&#xff0c;算是一次成功的探索。本文分享自华为云社区《当线下门店遇上AI—华为云ModelBox携手佳华科技客流分析实践》&#xff0c;作者&…

linux安装mysql8超详细到每步命令

1、到指定目录去下载安装包 cd /usr/local/src 2、下载mysql8 版本可以自己选择 wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.20-linux-glibc2.12-x86_64.tar.xz 3、解压mysql8, 通过xz命令解压出tar包(需要发时间解压可能会久&#xff0c;根据服务器性…

如何理解死锁?

目录 今日良言:等风来,不如追风去 一、死锁 1.概念 2.死锁的三个典型情况 3.死锁的必要条件 4.如何破除死锁 &#x1f433;今日良言:等风来,不如追风去 &#x1f415;一、死锁 &#x1f407;1.概念 多个线程在争夺资源时,陷入了僵持状态,都无法进行下去,都在等待对方释…