Spring MVC方法参数注入

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring MVC方法参数注入相关的知识,希望对你有一定的参考价值。

参考技术A 我们都知道,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插件文档

Spring MVC 如何为控制器方法提供可注入

【中文标题】Spring MVC 如何为控制器方法提供可注入【英文标题】:Spring MVC How to provide injectable for controller method 【发布时间】:2016-12-09 00:39:52 【问题描述】:

Spring MVC 控制器方法接受在调用方法之前注入的不同参数。比如HttpServletRequestHttpServletResponsejava.security.Principal

@RequestMapping("/test")
public String test(HttpServletRequest req, Principal user)

如何声明可以注入到控制器方法中的东西?

@RequestMapping("/test")
public String test(MyCustomInjectable myInjectable)

更多具体案例:

我想在一些 servlet 过滤器中解析 HttpServletRequest 并构造一个将在控制器方法中使用的对象。更准确地说,我将解析 JWT 令牌并访问声明。

【问题讨论】:

如果是同一个请求对象,您可以将请求中的每个字段值设置为请求属性,spring会根据请求属性名称自动创建您的自定义对象。如果您稍后在其他请求中需要自定义对象,您可以从请求中获取会话并使用会话属性将自定义对象保存在会话中 可能相关:***.com/questions/17741787/… 【参考方案1】:

可以选择创建自定义HandlerMethodArgumentResolver

【讨论】:

正是我想要的。谢谢。 如果使用这个,可以注入一个原型bean,该bean配置有带有InjectionPoint参数的工厂方法,并以这种方式注入一个依赖于其他参数的自定义bean控制器方法(例如,路径变量)?

以上是关于Spring MVC方法参数注入的主要内容,如果未能解决你的问题,请参考以下文章

spring mvc获取header

Spring MVC基础篇4

Java 求spring用@Autowired进行方法参数注入例子。

Spring属性注入构造方法注入工厂注入以及注入参数(转)

Spring MVC 之请求处理方法可接收参数

Spring MVC 的请求参数获取的几种方法