SpringBoot自定义参数解析器HandlerMethodArgumentResolver(解析ip)

简介: 自定义@Ip注解,获取请求的ip

演示

自定义@Ip注解,获取请求的ip

2345_image_file_copy_491.jpg

2345_image_file_copy_492.jpg

原理

DispatcherServlet初始化的时候会初始组件RequestMappingHandlerMapping与RequestMappingHandlerAdapter

1、RequestMappingHandlerMapping组件

    RequestMappingHandlerMapping 初始化时,会收集所有 @RequestMapping 映射信息,封装为 Map,其中

         key 是 RequestMappingInfo 类型,包括请求路径、请求方法等信息

         value 是 HandlerMethod 类型,包括控制器方法对象、控制器对象

    有了这个 Map,就可以在请求到达时,快速完成映射,找到 HandlerMethod 并与匹配的拦截器一起返回给 DispatcherServlet

2、RequestMappingHandlerAdapter组件

    RequestMappingHandlerAdapter 初始化时,会准备 HandlerMethod 调用时需要的各个组件,如:

         HandlerMethodArgumentResolver 解析控制器方法参数

         HandlerMethodReturnValueHandler 处理控制器方法返回值

RequestMappingHandlerAdapter组件就是调用映射方法的,也就是上面的test01,调用方法前自然要解析参数,自然就有解析参数的组件–>HandlerMethodArgumentResolver 解析控制器方法参数

步骤

1、定义注解

/*
* 功能:获取请求时的ip
* */
@Target(ElementType.PARAMETER)//作用范围(方法)
@Retention(RetentionPolicy.RUNTIME)//作用时间(运行时)
public @interface Ip {
}

2、自定义参数解析器

实现HandlerMethodArgumentResolver接口

public class IpArgumentResolver implements HandlerMethodArgumentResolver {
    // 这个方法是否标有这个注解
    @Override
    public boolean supportsParameter(MethodParameter methodParameter) {
        Ip ip = methodParameter.getParameterAnnotation(Ip.class);
        return ip != null;
    }
//具体业务操作,获取HttpServletRequest请求,获取ip并返回
    @Override
    public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {
        HttpServletRequest request = nativeWebRequest.getNativeRequest(HttpServletRequest.class);
        String remoteAddr = request.getRemoteAddr();
        return remoteAddr;
    }
}

3、将自定义的参数解析器注册进容器

RequestMappingHandlerAdapter调用映射方法的时候会初始化

HandlerMethodArgumentResolver也就是我们自定义的参数解析器与一些它自己的参数解析器到时候就会解析@Ip注解了

@Configuration
public class MyConfig implements WebMvcConfigurer {
    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
        resolvers.add(new IpArgumentResolver());
    }
}
相关文章
|
12天前
|
缓存 Java 开发者
10个点介绍SpringBoot3工作流程与核心组件源码解析
Spring Boot 是Java开发中100%会使用到的框架,开发者不仅要熟练使用,对其中的核心源码也要了解,正所谓知其然知其所以然,V 哥建议小伙伴们在学习的过程中,一定要去研读一下源码,这有助于你在开发中游刃有余。欢迎一起交流学习心得,一起成长。
|
13天前
|
运维 网络协议 安全
Serverless 应用引擎产品使用之阿里云函数计算中添加自定义域名进行域名DNS验证如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
22 1
|
16天前
|
Java Spring 容器
SpringBoot自动装配原理之@Import注解解析
SpringBoot自动装配原理之@Import注解解析
53 0
|
16天前
|
canal 缓存 关系型数据库
Spring Boot整合canal实现数据一致性解决方案解析-部署+实战
Spring Boot整合canal实现数据一致性解决方案解析-部署+实战
|
16天前
|
XML 人工智能 Java
Spring Bean名称生成规则(含源码解析、自定义Spring Bean名称方式)
Spring Bean名称生成规则(含源码解析、自定义Spring Bean名称方式)
|
19天前
|
JSON Java Maven
Javaweb之SpringBootWeb案例之 SpringBoot原理的详细解析
Javaweb之SpringBootWeb案例之 SpringBoot原理的详细解析
45 0
Javaweb之SpringBootWeb案例之 SpringBoot原理的详细解析
|
19天前
|
Java 数据库连接 容器
SpringBoot之IOC&DI的详细解析
SpringBoot之IOC&DI的详细解析
10 0
SpringBoot之IOC&DI的详细解析
|
19天前
|
存储 Java 程序员
SpringBoot之分层解耦以及 IOC&DI的详细解析
SpringBoot之分层解耦以及 IOC&DI的详细解析
13 0
|
4天前
|
Java Android开发
Android12 双击power键启动相机源码解析
Android12 双击power键启动相机源码解析
14 0
|
1天前
PandasTA 源码解析(一)(2)
PandasTA 源码解析(一)
7 0

推荐镜像

更多