Spring 根据参数名称注入值

在Spring 框架中 很常见根据参数名称自动赋值的反射操作 例如:Spring MVC 中前台请求具体的Controller 而具体的方法的入参可以根据参数名自动复制。

JDK提供的反射 没用这样的功能 仅提供了 按参数顺序顺序赋值。

而Spring 则使用了第三方的字节码解析工具(asm) 从字节码中读取各个方法的参数名称 具体实现可 查看LocalVariableTableParameterNameDiscoverer 类


本人在项目的一次使用

   主要是为了将 保存数据 和修改流程状态放在同一个事务中处理,然而 保存 和修改状态又都是可以单独发起的前台请求

  所有 保存 数据的请求包含了 修改流程状态的URL 根据spring的 url与Controller的映射发现类(RequestMappingHandlerMapping)可以找到对应的Controller 

 然后通过上面提到的具体的参数发现类 给 具体的Controller的入参赋值 然后调起后续修改流程的状态

      /**

* @Description: 根据url 找到对应的controller的某一方法的调起实现 主要功能是匹配参数
* @param jsonparam  调用后续操作方法是需要的参数  建议使用json 这有助于解耦
* @param method 根据spring的  url与controller对应关系 获得的HandlerMethod 就是后续操作需要调起的Method对象
* @return
* @throws Exception
*/
public static Object invokeCallMethod(Object jsonparam, HandlerMethod method)
throws Exception {
Method methodtarget = method.getMethod();
//一般url对应的controller的方法不可能非public的 或者反射不可访问的  此段留作备用
//ReflectionUtils.makeAccessible(methodtarget);
 
String[] parameterNames = discoverer.getParameterNames(methodtarget);
Object[] param = new Object[parameterNames.length];
JSONObject jsonObject = JSONObject.fromObject(jsonparam);
 
/**
* 准备调起methodtarget的参数 所有参数默认使用的是string类型
* json传递的数据类型:spfid:1 对用的后台参数为int类型  spfid:"1"用的后台参数为string类型

* 若程序报 参数不匹配 的异常的 请检查后台控制层的参数类型是否为string类型

*/
for (int i = 0; i < parameterNames.length; i++) {
param[i] = jsonObject.get(parameterNames[i])+"";
}

Object targetObject = method.createWithResolvedBean().getBean();

return methodtarget.invoke(targetObject, param);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值