【方向盘】为何Spring MVC可获取到方法参数名,而MyBatis却不行?(下)

简介: 【方向盘】为何Spring MVC可获取到方法参数名,而MyBatis却不行?(下)

Spring MVC为何好使?


首先使用上需明确:Spring MVC好使但它并不依赖于-parameters参数,也不依赖于-g这个编译参数,因为它是借助ASM来实现的~


spring-core中有个ParameterNameDiscoverer就是用来获取参数名的,底层用的是asm解析,但是接口方法的参数名无法得到,即只能是非接口类的方法参数名可以。

从文首的例子可以看出Spring MVC它最终依赖的是DefaultParameterNameDiscoverer去帮忙获取到入参名,看看这块代码:


// @since 4.0
public class DefaultParameterNameDiscoverer extends PrioritizedParameterNameDiscoverer {
  public DefaultParameterNameDiscoverer() {
    if (!GraalDetector.inImageCode()) {
      if (KotlinDetector.isKotlinReflectPresent()) {
        addDiscoverer(new KotlinReflectionParameterNameDiscoverer());
      }
      addDiscoverer(new StandardReflectionParameterNameDiscoverer());
      addDiscoverer(new LocalVariableTableParameterNameDiscoverer());
    }
  }
}


DefaultParameterNameDiscoverer它就是一个责任链模式的体现,靠它添加进来的实现类来处理,也就是这哥俩:

StandardReflectionParameterNameDiscoverer:依赖于-parameters才会有效(有java版本要求和编译参数要求)

LocalVariableTableParameterNameDiscoverer:基于ASM实现,无版本和编译参数要求~


备注:Spring使用ASM无需额外导包,因为自给自足了:


image.png


MyBatis为何不好使?


首先使用上需要明确这一点:MyBatis通过接口跟SQL语句绑定然后生成代理类来实现的。


既然有了强大的ASM,那么问题来了:难道ASM也帮不到MyBatis来简化开发?

看看我给的这个例子或许你就能明白了并不能怪MyBatis呀:


public class MainTest2 {
  // 使用工具方法获取Method的入参名字~~~
    public static void main(String[] args) throws SecurityException, NoSuchMethodException, IOException {
        Method method = MainTest2.class.getDeclaredMethod("testArgName", String.class, Integer.class);
        String[] methodParamNames = getMethodParamNames(method);
        // 打印输出
        System.out.println(StringUtils.arrayToCommaDelimitedString(methodParamNames));
    }
}
// 接口方法
interface MyDemoInterface{
    String testArgName(String name, Integer age);
}


输出:


null,null


可见即使强如ASM,也是木有办法直接获取到接口的形参名的。

这是可以被理解的,因为接口方法不是实际方法,它的形参名是会被实现类覆盖的,所以接口方法的形参名意义不大~


Tips:接口上的default方法和static方法的参数名是可以被正常获取到的,有兴趣的小伙伴可以自己动手试试~


至于ASM为何对接口无效,其根本原因我展示一下字节码一看便清楚了:


image.png


因为抽象方法没有方法体,也就没有局部变量,自然也就没有局部变量表了,所以即使使用ASM也拿不到它的变量名~


说明:在Java8后使用-parameter参数即使是接口,是可以直接通过Method获取到入参名的,这个对MyBatis是好用的。当然为了保证兼容性,个人建议还是乖乖使用@Param注解来指定吧~


至此,我有理由相信小伙伴是和我一样,彻底搞明白为何Spring MVC可以,但MyBatis却不可以这个疑问了吧~~~


总结


本文深入到字节码处分析了这个有可能也是困扰了你很久的问题(问题如题),希望为你答疑解惑了。同时也介绍了ASM的基本用法,或许对你后续理解别的框架会有所帮助~

相关文章
|
23天前
|
前端开发 Java Spring
Spring MVC源码分析之DispatcherServlet#getHandlerAdapter方法
`DispatcherServlet`的 `getHandlerAdapter`方法是Spring MVC处理请求的核心部分之一。它通过遍历预定义的 `HandlerAdapter`列表,找到适用于当前处理器的适配器,并调用适配器执行具体的处理逻辑。理解这个方法有助于深入了解Spring MVC的工作机制和扩展点。
31 1
|
29天前
|
存储 安全 Java
|
24天前
|
前端开发 Java Spring
Spring MVC源码分析之DispatcherServlet#getHandlerAdapter方法
`DispatcherServlet`的 `getHandlerAdapter`方法是Spring MVC处理请求的核心部分之一。它通过遍历预定义的 `HandlerAdapter`列表,找到适用于当前处理器的适配器,并调用适配器执行具体的处理逻辑。理解这个方法有助于深入了解Spring MVC的工作机制和扩展点。
25 1
|
1月前
|
前端开发 Java Apache
Springboot整合shiro,带你学会shiro,入门级别教程,由浅入深,完整代码案例,各位项目想加这个模块的人也可以看这个,又或者不会mybatis-plus的也可以看这个
本文详细讲解了如何整合Apache Shiro与Spring Boot项目,包括数据库准备、项目配置、实体类、Mapper、Service、Controller的创建和配置,以及Shiro的配置和使用。
319 1
Springboot整合shiro,带你学会shiro,入门级别教程,由浅入深,完整代码案例,各位项目想加这个模块的人也可以看这个,又或者不会mybatis-plus的也可以看这个
|
1月前
|
JSON 前端开发 Java
SSM:SpringMVC
本文介绍了SpringMVC的依赖配置、请求参数处理、注解开发、JSON处理、拦截器、文件上传下载以及相关注意事项。首先,需要在`pom.xml`中添加必要的依赖,包括Servlet、JSTL、Spring Web MVC等。接着,在`web.xml`中配置DispatcherServlet,并设置Spring MVC的相关配置,如组件扫描、默认Servlet处理器等。然后,通过`@RequestMapping`等注解处理请求参数,使用`@ResponseBody`返回JSON数据。此外,还介绍了如何创建和配置拦截器、文件上传下载的功能,并强调了JSP文件的放置位置,避免404错误。
|
1月前
|
Java 关系型数据库 MySQL
springboot学习五:springboot整合Mybatis 连接 mysql数据库
这篇文章是关于如何使用Spring Boot整合MyBatis来连接MySQL数据库,并进行基本的增删改查操作的教程。
81 0
springboot学习五:springboot整合Mybatis 连接 mysql数据库
|
1月前
|
Java 数据库连接 API
springBoot:后端解决跨域&Mybatis-Plus&SwaggerUI&代码生成器 (四)
本文介绍了后端解决跨域问题的方法及Mybatis-Plus的配置与使用。首先通过创建`CorsConfig`类并设置相关参数来实现跨域请求处理。接着,详细描述了如何引入Mybatis-Plus插件,包括配置`MybatisPlusConfig`类、定义Mapper接口以及Service层。此外,还展示了如何配置分页查询功能,并引入SwaggerUI进行API文档生成。最后,提供了代码生成器的配置示例,帮助快速生成项目所需的基础代码。
|
21天前
|
前端开发 Java Spring
Spring MVC源码分析之DispatcherServlet#getHandlerAdapter方法
`DispatcherServlet`的 `getHandlerAdapter`方法是Spring MVC处理请求的核心部分之一。它通过遍历预定义的 `HandlerAdapter`列表,找到适用于当前处理器的适配器,并调用适配器执行具体的处理逻辑。理解这个方法有助于深入了解Spring MVC的工作机制和扩展点。
22 0
|
1月前
|
前端开发 Java 应用服务中间件
【Spring】Spring MVC的项目准备和连接建立
【Spring】Spring MVC的项目准备和连接建立
57 2
|
1月前
|
前端开发 Java 数据库连接
表白墙/留言墙 —— 中级SpringBoot项目,MyBatis技术栈MySQL数据库开发,练手项目前后端开发(带完整源码) 全方位全步骤手把手教学
本文是一份全面的表白墙/留言墙项目教程,使用SpringBoot + MyBatis技术栈和MySQL数据库开发,涵盖了项目前后端开发、数据库配置、代码实现和运行的详细步骤。
47 0
表白墙/留言墙 —— 中级SpringBoot项目,MyBatis技术栈MySQL数据库开发,练手项目前后端开发(带完整源码) 全方位全步骤手把手教学
下一篇
无影云桌面