咱们 Controller
用到的一些 Bean
须要经过必定的方式去获取的,能够经过注入方式获取其余获取方式进行获取。java
好比:须要用到用户实例,咱们一般作法为下git
@Resource private UserService userService; @GetMapping("getUserByUsername") public String getUserByUsername(HttpServletRequest request) { ... AuthUser user = userService.getUserByUsername("小明"); ... }
这样是通常的作法,咱们能够发现 HttpServletRequest
能够经过注入方式加载,也能够直接在 public String getUserByUsername()
方法参数获取到。github
这样的方式 也把咱们的 User
对象封装到方法参数里。web
当咱们执行 Controller
就会有一个对应用户的对象存在了。spring
UserArgumentResolver
这里咱们须要使用到一个 HandlerMethodArgumentResolver
接口。springboot
自定义 UserArgumentResolver
处理 User
。微信
/** * 封装 参数方式获取 {@link AuthUser} 对象 * * @author purgeyao * @since 1.0 */ public class UserArgumentResolver implements HandlerMethodArgumentResolver { @Override public boolean supportsParameter(MethodParameter methodParameter) { Class<?> aClass = methodParameter.getParameterType(); // 判断是否为 AuthUser 类 return aClass == AuthUser.class; } @Override public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception { HttpServletRequest request = nativeWebRequest.getNativeRequest(HttpServletRequest.class); // 获取参数 String name = request.getParameter("name"); // TODO 获取对应的用户对象 查询操做 AuthUser user = userService.getUserByUsername(name); return user; } }
上述代码会在执行 Controller
以前处理。经过获取请求头 或者 请求里的参数(具体看本身的业务)。app
执行相应的对象查询操做。接下来就能够在 Controller
参数里能够方便使用了。ide
Controller
方法参数使用@GetMapping("getUserByUsername") public String getUserByUsername(AuthUser user) { ... user.getAge(); ... }
上述介绍 HandlerMethodArgumentResolver
使用,原理请参考相关文章。code
示例代码地址:UserArgumentResolver
做者GitHub:
Purgeyao 欢迎关注
qq交流群:
812321371
微信交流群:MercyYao
微信公众号: