在springboot中使用注解将值注入参数的操作

 更新时间:2020年04月26日 10:10:15   作者:一条独立特行的咸鱼  
这篇文章主要介绍了在springboot中使用注解将值注入参数的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

后端的许多管理系统需要登陆者的信息,如shiro登陆后,会将登陆者的信息存储在shiro的session,在使用时需要多行代码获取用户信息。可以把获取在shiro中的登陆者信息封装在一个类中,使用时获取。本文主要讲述如何使用注解将值注入参数,shiro的配置请自行百度。

定义注解

新建一个InfoAnnotation.java的注解类,用于注解参数,代码如下:

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface InfoAnnotation {
 String value() default "userId";//默认获取userId的值
}

定义注解处理类

新建一个InfoResolver类,AOP无法将值注入参数,需要继承HandlerMethodArgumentResolver类,代码如下:

public class InfoResolver implements HandlerMethodArgumentResolver {
 //使用自定义的注解
 @Override
 public boolean supportsParameter(MethodParameter methodParameter) {
 return methodParameter.hasParameterAnnotation(InfoAnnotation.class);
 }

 //将值注入参数
 @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);
}

登陆返回的信息

调用测试用例返回的信息

可以看到登陆返回的用户信息的id和测试用例返回的data一致。

以上这篇在springboot中使用注解将值注入参数的操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • SpringBoot中自动配置原理解析

    SpringBoot中自动配置原理解析

    SpringBoost是基于Spring框架开发出来的功能更强大的Java程序开发框架,本文将以广角视觉来剖析SpringBoot自动配置的原理,涉及部分Spring、SpringBoot源码,需要的可以参考下
    2023-11-11
  • 详细谈谈Java中long和double的原子性

    详细谈谈Java中long和double的原子性

    原子性是指一个操作或多个操作要么全部执行,且执行的过程不会被任何因素打断,要么就都不执行,下面这篇文章主要给大家介绍了关于Java中long和double原子性的相关资料,需要的朋友可以参考下
    2021-08-08
  • Java GUI编程菜单组件实例详解

    Java GUI编程菜单组件实例详解

    在实际开发中,除了主界面,还有一类比较重要的内容就是菜单相关组件,可以通过菜单相关组件很方便的使用特定的功能,今天通过本文给大家介绍下Java GUI编程菜单组件实例详解,感兴趣的朋友一起看看吧
    2022-04-04
  • Java过滤器doFilter里chain.doFilter()函数的理解

    Java过滤器doFilter里chain.doFilter()函数的理解

    这篇文章主要介绍了Java过滤器doFilter里chain.doFilter()函数的理解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • SpringCloud+Redis实现Api接口限流防止恶意刷接口

    SpringCloud+Redis实现Api接口限流防止恶意刷接口

    接口限流是为了保护系统和服务,防止因为过多的请求而崩溃,本文主要介绍了SpringCloud+Redis实现Api接口限流防止恶意刷接口,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • springboot项目docker分层构建的配置方式

    springboot项目docker分层构建的配置方式

    在使用dockerfile构建springboot项目时,速度较慢,用时比较长,为了加快构建docker镜像的速度,采用分层构建的方式,这篇文章主要介绍了springboot项目docker分层构建,需要的朋友可以参考下
    2024-03-03
  • 使用spring整合Quartz实现—定时器功能

    使用spring整合Quartz实现—定时器功能

    这篇文章主要介绍了使用spring整合Quartz实现—定时器功能,不基于特定的基类的方法,需要的朋友可以参考下
    2018-04-04
  • 详解Elastic Search搜索引擎在SpringBoot中的实践

    详解Elastic Search搜索引擎在SpringBoot中的实践

    本篇文章主要介绍了Elastic Search搜索引擎在SpringBoot中的实践,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • Spring基于XML实现Aop

    Spring基于XML实现Aop

    这篇文章主要介绍了Spring中基于xml的AOP的详细步骤,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-07-07
  • java实现时钟效果

    java实现时钟效果

    这篇文章主要为大家详细介绍了java实现时钟效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03

最新评论