我们 Controller 用到的一些 Bean 需要通过一定的方式去获取的,可以通过注入方式获取其他获取方式进行获取。 
比如:需要用到用户实例,我们通常做法为下
@Resource
private UserService userService;
@GetMapping("getUserByUsername")
public String getUserByUsername(HttpServletRequest request) {
    ...
    AuthUser user = userService.getUserByUsername("小明");
    ...
} 
  这样是一般的做法,我们可以发现 HttpServletRequest 可以通过注入方式加载,也可以直接在 public String getUserByUsername() 方法参数获取到。 
 这样的方式 也把我们的 User 对象封装到方法参数里。 
 当我们执行 Controller 就会有一个对应用户的对象存在了。 
UserArgumentResolver  这里我们需要使用到一个 HandlerMethodArgumentResolver 接口。 
 自定义 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 之前处理。通过获取请求头 或者 请求里的参数(具体看自己的业务)。 
 执行相应的对象查询操作。接下来就可以在 Controller 参数里可以方便使用了。 
Controller 方法参数使用 @GetMapping("getUserByUsername")
public String getUserByUsername(AuthUser user) {
    ...
    user.getAge();
    ...
} 
  上述介绍 HandlerMethodArgumentResolver 使用,原理请参考相关文章。 
作者GitHub:
Purgeyao 欢迎关注
 qq交流群: 812321371 微信交流群: MercyYao 
微信公众号: