在springboot中使用注解將值注入?yún)?shù)的操作
后端的許多管理系統(tǒng)需要登陸者的信息,如shiro登陸后,會(huì)將登陸者的信息存儲(chǔ)在shiro的session,在使用時(shí)需要多行代碼獲取用戶信息??梢园勋@取在shiro中的登陸者信息封裝在一個(gè)類中,使用時(shí)獲取。本文主要講述如何使用注解將值注入?yún)?shù),shiro的配置請(qǐng)自行百度。
定義注解
新建一個(gè)InfoAnnotation.java的注解類,用于注解參數(shù),代碼如下:
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface InfoAnnotation {
String value() default "userId";//默認(rèn)獲取userId的值
}
定義注解處理類
新建一個(gè)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支持該攔截器
修改啟動(dòng)類,繼承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());
}
}
測(cè)試
測(cè)試用例,如下代碼
@GetMapping
public BaseResponse<?> test(@InfoAnnotation int userId){
return ResponseUtil.successResponse(userId);
}
登陸返回的信息

調(diào)用測(cè)試用例返回的信息

可以看到登陸返回的用戶信息的id和測(cè)試用例返回的data一致。
以上這篇在springboot中使用注解將值注入?yún)?shù)的操作就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java IO流學(xué)習(xí)總結(jié)之文件傳輸基礎(chǔ)
這篇文章主要介紹了Java IO流學(xué)習(xí)總結(jié)之文件傳輸基礎(chǔ),文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java io流的小伙伴們有很好的幫助,需要的朋友可以參考下2021-04-04
多數(shù)據(jù)源如何實(shí)現(xiàn)事務(wù)管理
Spring中涉及三個(gè)核心事務(wù)處理接口:PlatformTransactionManager、TransactionDefinition和TransactionStatus,PlatformTransactionManager提供事務(wù)操作的基本方法,如獲取事務(wù)、提交和回滾2024-09-09
Java模擬死鎖發(fā)生之演繹哲學(xué)家進(jìn)餐問題案例詳解
這篇文章主要介紹了Java模擬死鎖發(fā)生之演繹哲學(xué)家進(jìn)餐問題,結(jié)合具體演繹哲學(xué)家進(jìn)餐問題的案例形式詳細(xì)分析了死鎖機(jī)制與原理,需要的朋友可以參考下2019-10-10
Mybatis批量插入返回成功的數(shù)目實(shí)例
這篇文章主要介紹了Mybatis批量插入返回成功的數(shù)目實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-12-12
Java httpClient連接池支持多線程高并發(fā)的實(shí)現(xiàn)
本文主要介紹了Java httpClient連接池支持多線程高并發(fā)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08
Spring Boot之AOP配自定義注解的最佳實(shí)踐過程
這篇文章主要給大家介紹了關(guān)于Spring Boot之AOP配自定義注解的最佳實(shí)踐過程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-11-11
Spring Security 安全框架應(yīng)用原理解析
這篇文章主要介紹了Spring Security 安全框架應(yīng)用,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-07-07

