在springboot中使用注解將值注入?yún)?shù)的操作
后端的許多管理系統(tǒng)需要登陸者的信息,如shiro登陸后,會將登陸者的信息存儲在shiro的session,在使用時需要多行代碼獲取用戶信息??梢园勋@取在shiro中的登陸者信息封裝在一個類中,使用時獲取。本文主要講述如何使用注解將值注入?yún)?shù),shiro的配置請自行百度。
定義注解
新建一個InfoAnnotation.java的注解類,用于注解參數(shù),代碼如下:
@Target(ElementType.PARAMETER) @Retention(RetentionPolicy.RUNTIME) public @interface InfoAnnotation { String value() default "userId";//默認(rèn)獲取userId的值 }
定義注解處理類
新建一個InfoResolver類,AOP無法將值注入?yún)?shù),需要繼承HandlerMethodArgumentResolver類,代碼如下:
public class InfoResolver implements HandlerMethodArgumentResolver { //使用自定義的注解 @Override public boolean supportsParameter(MethodParameter methodParameter) { return methodParameter.hasParameterAnnotation(InfoAnnotation.class); } //將值注入?yún)?shù) @Override public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception { //獲取捕獲到的注解 InfoAnnotation annotation = methodParameter.getParameterAnnotation(InfoAnnotation.class); String value = annotation.value(); //獲取需要注入值得邏輯 //該例子在shiro中獲取userId或者用戶信息 if (value == null || "".equalsIgnoreCase(value) || value.equalsIgnoreCase("userId")){ User user = (User)SecurityUtils.getSubject().getSession().getAttribute("user"); if (user == null){ return 1; } return user.getId(); } else if ("user".equalsIgnoreCase(value)){ return SecurityUtils.getSubject().getSession().getAttribute("user"); } return value; } }
使springboot支持該攔截器
修改啟動類,繼承WebMvcConfigurationSupport類,添加自定義得攔截器,代碼如下:
@SpringBootApplication public class DemoApplication extends WebMvcConfigurationSupport { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } //添加自定義的攔截器 @Override public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers){ super.addArgumentResolvers(argumentResolvers); argumentResolvers.add(new InfoResolver()); } }
測試
測試用例,如下代碼
@GetMapping public BaseResponse<?> test(@InfoAnnotation int userId){ return ResponseUtil.successResponse(userId); }
登陸返回的信息
調(diào)用測試用例返回的信息
可以看到登陸返回的用戶信息的id和測試用例返回的data一致。
以上這篇在springboot中使用注解將值注入?yún)?shù)的操作就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
詳細(xì)談?wù)凧ava中l(wèi)ong和double的原子性
原子性是指一個操作或多個操作要么全部執(zhí)行,且執(zhí)行的過程不會被任何因素打斷,要么就都不執(zhí)行,下面這篇文章主要給大家介紹了關(guān)于Java中l(wèi)ong和double原子性的相關(guān)資料,需要的朋友可以參考下2021-08-08Java過濾器doFilter里chain.doFilter()函數(shù)的理解
這篇文章主要介紹了Java過濾器doFilter里chain.doFilter()函數(shù)的理解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11SpringCloud+Redis實現(xiàn)Api接口限流防止惡意刷接口
接口限流是為了保護(hù)系統(tǒng)和服務(wù),防止因為過多的請求而崩潰,本文主要介紹了SpringCloud+Redis實現(xiàn)Api接口限流防止惡意刷接口,具有一定的參考價值,感興趣的可以了解一下2024-03-03springboot項目docker分層構(gòu)建的配置方式
在使用dockerfile構(gòu)建springboot項目時,速度較慢,用時比較長,為了加快構(gòu)建docker鏡像的速度,采用分層構(gòu)建的方式,這篇文章主要介紹了springboot項目docker分層構(gòu)建,需要的朋友可以參考下2024-03-03使用spring整合Quartz實現(xiàn)—定時器功能
這篇文章主要介紹了使用spring整合Quartz實現(xiàn)—定時器功能,不基于特定的基類的方法,需要的朋友可以參考下2018-04-04詳解Elastic Search搜索引擎在SpringBoot中的實踐
本篇文章主要介紹了Elastic Search搜索引擎在SpringBoot中的實踐,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-01-01