返回顶部
首页 > 资讯 > 精选 >怎么使用Spring AOP预处理Controller的参数
  • 839
分享到

怎么使用Spring AOP预处理Controller的参数

2023-06-20 20:06:02 839人浏览 泡泡鱼
摘要

这篇文章主要为大家展示了“怎么使用spring aop预处理Controller的参数”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“怎么使用Spring AOP预处理Controller的参数”

这篇文章主要为大家展示了“怎么使用spring aop预处理Controller的参数”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“怎么使用Spring AOP预处理Controller的参数”这篇文章吧。

Spring AOP预处理Controller的参数

实际编程中,可能会有这样一种情况,前台传过来的参数,我们需要一定的处理才能使用

比如有这样一个Controller

@Controllerpublic class MatchOddsController {    @Autowired    private MatchOddsServcie matchOddsService;    @RequestMapping(value = "/listOdds", method = RequestMethod.GET, produces = {MediaType.APPLICATioN_JSON_VALUE})    @ResponseBody    public List<OddsModel> listOdds(@RequestParam Date startDate, @RequestParam Date endDate) {        return matchOddsService.listOdds(startDate, endDate);    }}

前台传过来的startDate和endDate是两个日期,实际使用中我们需要将之转换为两个日期对应的当天11点,如果只有这么一个类的话,我们是可以直接在方法最前面处理就可以了

但是,还有下面两个类具有同样的业务逻辑

@Controllerpublic class MatchProductController {    @Autowired    private MatchProductService matchProductService;    @RequestMapping(value = "/listProduct", method = RequestMethod.GET, produces = { MediaType.APPLICATION_jsON_VALUE })    @ResponseBody    public List<ProductModel> listProduct(@RequestParam Date startDate, @RequestParam Date endDate) {        return matchProductService.listMatchProduct(startDate, endDate);    }}
@Controllerpublic class MatchController {    @Autowired    private MatchService matchService;        @RequestMapping(value = "/listMatch", method = RequestMethod.GET, produces = {MediaType.APPLICATION_JSON_VALUE})    @ResponseBody    public List<MatchModel> listMatch(@RequestParam Date startDate, @RequestParam Date endDate) {        return matchService.listMatch(startDate, endDate);    }}

当然也可以写两个util方法,分别处理startDate和endDate,但是为了让Controller看起来更干净一些,我们还是用AOP来实现吧,顺便为AOP更复杂的应用做做铺垫

本应用中使用Configuration Class来进行配置,

主配置类如下:

@SpringBootApplication@EnableAspectJAutoProxy(proxyTargetClass = true) //开启AspectJ代理,并将proxyTargetClass置为true,表示启用cglib对Class也进行代理public class Application extends SpringBootServletInitializer {    ...}

下面新建一个Aspect类,代码如下

@Aspect //1@Configuration //2public class SearchDateAspect {    @Pointcut("execution(* com.ronnie.controller.*.list*(java.util.Date,java.util.Date)) && args(startDate,endDate)") //3    private void searchDatePointcut(Date startDate, Date endDate) { //4    }    @Around(value = "searchDatePointcut(startDate,endDate)", argNames = "startDate,endDate") //5    public Object dealSearchDate(ProceedingJoinPoint joinpoint, Date startDate, Date endDate) throws Throwable { //6        Object[] args = joinpoint.getArgs(); //7        if (args[0] == null) {            args[0] = Calendars.getTodayEleven();            args[1] = DateUtils.add(new Date(), 7, TimeUnit.DAYS);//默认显示今天及以后的所有赔率        } else {            args[0] = DateUtils.addHours(startDate, 11);            args[1] = DateUtils.addHours(endDate, 11);        }        return joinpoint.proceed(args); //8    }}

分别解释一下上面各个地方的意思,标号与语句之后的注释一致

  1. 表示这是一个切面类

  2. 表示这个类是一个配置类,在ApplicationContext启动时会加载配置,将这个类扫描到

  3. 定义一个切点,execution(* com.ronnie.controller.*.list*(java.util.Date,java.util.Date))表示任意返回值,在com.ronnie.controller包下任意类的以list开头的方法,方法带有两个Date类型的参数,args(startDate,endDate)表示需要Spring传入这两个参数

  4. 定义切点的名称

  5. 配置环绕通知

  6. ProceedingJoinPoint会自动传入,用于处理真实的调用

  7. 获取参数,下面代码是修改参数

  8. 使用修改过的参数调用目标类

更多可参考

Http://docs.spring.io/spring/docs/current/spring-framework-reference/html/aop.html

http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/

AOP获取参数名称

由于项目中打印日志的需要,研究了一下在aop中,获取参数名称的方法。

1、jdk1,8中比较简单,直接通过joinPoint中的getSignature()方法即可获取

Signature signature = joinpoint.getSignature();  MethodSignature methodSignature = (MethodSignature) signature;  String[] strings = methodSignature.getParameterNames();  System.out.println(Arrays.toString(strings));

怎么使用Spring AOP预处理Controller的参数

2.通用方法。比较麻烦

public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable{                    String classType = joinPoint.getTarget().getClass().getName();            Class<?> clazz = Class.forName(classType);            String clazzName = clazz.getName();            String methodName = joinPoint.getSignature().getName(); //获取方法名称           Object[] args = joinPoint.getArgs();//参数            //获取参数名称和值          Map<String,Object > nameAndArgs = getFieldsName(this.getClass(), clazzName, methodName,args);           System.out.println(nameAndArgs.toString());          //为了省事,其他代码就不写了,          return result = joinPoint.proceed();     }
private Map<String,Object> getFieldsName(Class cls, String clazzName, String methodName, Object[] args) throws NotFoundException {           Map<String,Object > map=new HashMap<String,Object>();                    ClassPool pool = ClassPool.getDefault();            //ClassClassPath classPath = new ClassClassPath(this.getClass());            ClassClassPath classPath = new ClassClassPath(cls);            pool.insertClassPath(classPath);                        CtClass cc = pool.get(clazzName);            CtMethod cm = cc.getDeclaredMethod(methodName);            MethodInfo methodInfo = cm.getMethodInfo();          CodeAttribute codeAttribute = methodInfo.getCodeAttribute();            LocalVariableAttribute attr = (LocalVariableAttribute) codeAttribute.getAttribute(LocalVariableAttribute.tag);            if (attr == null) {                // exception            }           // String[] paramNames = new String[cm.getParameterTypes().length];            int pos = Modifier.isStatic(cm.getModifiers()) ? 0 : 1;            for (int i = 0; i < cm.getParameterTypes().length; i++){                map.put( attr.variableName(i + pos),args[i]);//paramNames即参数名            }                      //Map<>          return map;        }

以上是“怎么使用Spring AOP预处理Controller的参数”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

--结束END--

本文标题: 怎么使用Spring AOP预处理Controller的参数

本文链接: https://lsjlt.com/news/300007.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 怎么使用Spring AOP预处理Controller的参数
    这篇文章主要为大家展示了“怎么使用Spring AOP预处理Controller的参数”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“怎么使用Spring AOP预处理Controller的参数”...
    99+
    2023-06-20
  • 如何使用Spring AOP预处理Controller的参数
    Spring AOP预处理Controller的参数 实际编程中,可能会有这样一种情况,前台传过来的参数,我们需要一定的处理才能使用 比如有这样一个Controller @Con...
    99+
    2024-04-02
  • Spring Aop 怎么获取参数名参数值
    本篇内容主要讲解“Spring Aop 怎么获取参数名参数值”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spring Aop 怎么获取参数名参数值”吧!前言:有时候我们在用Spring Aop...
    99+
    2023-06-20
  • 使用AOP拦截Controller获取@PathVariable注解传入的参数
    目录AOP拦截Controller获取@PathVariable注解传入参数前言:示例代码:处理:扩展: aop中获取request和response动态参数使用@PathVaria...
    99+
    2024-04-02
  • 使用Spring Boot AOP处理方法的入参和返回值
    目录前言Spring AOP的简单介绍:1. 需求场景User类定义如下:2. 解决方案3. 代码实现Controller层UserController类的代码:Service层Us...
    99+
    2024-04-02
  • spring-AOP 及 AOP怎么获取request各项参数
    这篇文章主要介绍“spring-AOP 及 AOP怎么获取request各项参数”,在日常操作中,相信很多人在spring-AOP 及 AOP怎么获取request各项参数问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对...
    99+
    2023-06-20
  • 使用spring通过aop获取方法参数和参数值
    目录spring通过aop获取方法参数和参数值自定义注解切面aop切面 注解、参数获取1、定义需要切面的注解2、在需要进行切面的方法标注注解3、定义切面spring通过aop获取方法...
    99+
    2024-04-02
  • Spring AOP 后置处理器使用方式
    目录1 前言2 BeanPostProcesser 后置处理器3 总结1 前言 在 Spring 的体系中,在前文中已经讲述了 IOC 容器以及 Bean 的理解,在本文基于之前文章...
    99+
    2024-04-02
  • Java | 使用切面AOP拦截并修改Controller接口请求参数
    关注common wx: CodingTechWork 引言   在开发过程中,会有一些需求将controller层的一些方法入参进行全量转换,最容易想到的可能是在调用下层service方法时,调用公...
    99+
    2023-09-10
    java 开发语言
  • Spring的Controller怎么应用
    今天小编给大家分享一下Spring的Controller怎么应用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。概述Contr...
    99+
    2023-07-04
  • Spring AOP标签怎么使用
    这篇文章主要介绍“Spring AOP标签怎么使用”,在日常操作中,相信很多人在Spring AOP标签怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Spring AOP标签怎么使用”的疑惑有所帮助!...
    99+
    2023-06-02
  • Java的Spring AOP怎么用
    这篇文章主要介绍Java的Spring AOP怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!什么是AOP&作用AOP 为 Aspect Oriented Programming 的缩写,意思为...
    99+
    2023-06-29
  • controller函数中参数列表怎么使用多个@RequestBody
    这篇文章主要介绍“controller函数中参数列表怎么使用多个@RequestBody”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“controller函数中参数列表怎么使用多个@RequestB...
    99+
    2023-07-06
  • 关于SpringBoot中controller参数校验的使用
    目录单参数校验实体类校验分组校验嵌套校验自定义注解参数校验主要使用两个标签@Validated和@Valid; @Valid是Hibernate的注解校验,@Validated是sp...
    99+
    2023-01-15
    SpringBoot controller参数校验 SpringBoot 参数校验
  • 怎么使用Spring Boot处理JSON数据
    这篇文章主要介绍“怎么使用Spring Boot处理JSON数据”,在日常操作中,相信很多人在怎么使用Spring Boot处理JSON数据问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么使用Spring ...
    99+
    2023-06-02
  • 怎么使用css预处理器
    这篇文章给大家分享的是有关怎么使用css预处理器的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。 创建项目时未选择预处理器,需手动安装相应loader。...
    99+
    2024-04-02
  • @Around注解怎么在Spring AOP中使用
    这期内容当中小编将会给大家带来有关@Around注解怎么在Spring AOP中使用,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。@Around注解可以用来在调用一个具体方法前和调用后来完成一些具体的任务...
    99+
    2023-06-06
  • 怎么在不使用spring框架中使用aop的功能
    本篇文章为大家展示了怎么在不使用spring框架中使用aop的功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Spring框架的AOP机制可以让开发者把业务流程中的通用功能抽取出来,单独编写功能代...
    99+
    2023-06-22
  • css预处理器scss怎么使用
    这篇文章主要讲解了“css预处理器scss怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“css预处理器scss怎么使用”吧!1. 为什么会出现css...
    99+
    2024-04-02
  • 使用controller接收js传过来的参数问题
    目录controller接收js传过来的参数controller如何获取js传过来的值第一种方法第二种方法第三种方法 第四种方法总结controller接收js传过来的参数...
    99+
    2023-02-27
    controller接收参数 js参数 controller接收js参数
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作