Spring MVC方法参数注入

Spring MVC方法参数注入,第1张

我们都知道,Java源文件在编译成class文件后,所有的方法的参数名称信息都会丢失,因为方法的参数对于程序的运行毫无意义,之所以存在是为了提高程序的可读性,所有在编译之后就去掉了参数信息。但是很多程序在运行时又需要方法的参数信息,例如SpringMVC的在处理请求入参的时候。

前端入参name和address,是如何与方法中的name和address绑定上的?

在Java8中,提供了编译时参数 -parameters ,之后就可以通过反射的机制,获取方法参数信息。使用 -parameters 编译的字节码中会带有 MethodParameters 属性,使用 StandardReflectionParameterNameDiscoverer#getParameterNames 来获取。

如果需要在Java8中开启参数获取,可如下配置maven插件

Java8之前,可以通过开启调试模式,即编译时添加编译参数 -g 。使用 -g 编译的字节码中会带有 LocalVariableTable 属性,使用Spring中的 LocalVariableTableParameterNameDiscoverer#getParameterNames 通过 ASM 框架来获取。

但是在我们正常使用Maven开发SpringMVC的过程中,并没有添加这些编译参数,SpringMVC又是如何实现参数绑定的呢?

原因就是Maven的compiler编译插件默认帮我们做了这件事。

Maven compiler插件有个debug属性,默认是true。如果改成false,则SpringMVC的参数注入会失效。

所以 ASM 框架获取参数名称也是有前提条件的,必须添加 -g 编译参数,否则该框架也是不可能能从class文件中猜出原始的参数名称。

Maven compiler插件文档

在使用SpringMVC时,我们想传递数组引用类型,SpringMVC对数组传递有些限制:经过测试:SpringMVC支持一维数组的参数传递,不支持多维数组的参数传递,如果想传递多维数组,那么我们只好改用其他的法如:1、将多维数组拆成一维数组;


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/7943188.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-11
下一篇 2023-04-11

发表评论

登录后才能评论

评论列表(0条)

保存