咱們 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
微信公衆號: