spring通过aop获取方法参数和参数值的方法
发表于:2025-01-16 作者:千家信息网编辑
千家信息网最后更新 2025年01月16日,这篇文章主要介绍"spring通过aop获取方法参数和参数值的方法",在日常操作中,相信很多人在spring通过aop获取方法参数和参数值的方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作
千家信息网最后更新 2025年01月16日spring通过aop获取方法参数和参数值的方法
这篇文章主要介绍"spring通过aop获取方法参数和参数值的方法",在日常操作中,相信很多人在spring通过aop获取方法参数和参数值的方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"spring通过aop获取方法参数和参数值的方法"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
目录
spring通过aop获取方法参数和参数值
自定义注解
切面
aop切面 注解、参数获取
1、定义需要切面的注解
2、在需要进行切面的方法标注注解
3、定义切面
spring通过aop获取方法参数和参数值
自定义注解
package com.xiaolc.aspect; import java.lang.annotation.*; /** * @author lc * @date 2019/9/10 */@Documented@Target({ElementType.TYPE, ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)public @interface LiCheng {}
切面
package com.xiaolc.aspect; import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.Around;import org.aspectj.lang.annotation.Aspect;import org.springframework.core.DefaultParameterNameDiscoverer;import org.springframework.core.ParameterNameDiscoverer;import org.springframework.stereotype.Component; import java.lang.reflect.Method;import java.util.HashMap;import java.util.Map; /** * 获取方法上的注解值 */@Component@Aspectpublic class AuditAnnotationAspect { @Around("@annotation(liCheng))") private static Map getFieldsName(ProceedingJoinPoint joinPoint,LiCheng liCheng) throws ClassNotFoundException, NoSuchMethodException { String classType = joinPoint.getTarget().getClass().getName(); String methodName = joinPoint.getSignature().getName(); // 参数值 Object[] args = joinPoint.getArgs(); Class>[] classes = new Class[args.length]; for (int k = 0; k < args.length; k++) { if (!args[k].getClass().isPrimitive()) { // 获取的是封装类型而不是基础类型 String result = args[k].getClass().getName(); Class s = map.get(result); classes[k] = s == null ? args[k].getClass() : s; } } ParameterNameDiscoverer pnd = new DefaultParameterNameDiscoverer(); // 获取指定的方法,第二个参数可以不传,但是为了防止有重载的现象,还是需要传入参数的类型 Method method = Class.forName(classType).getMethod(methodName, classes); // 参数名 String[] parameterNames = pnd.getParameterNames(method); // 通过map封装参数和参数值 HashMapparamMap = new HashMap(); for (int i = 0; i < parameterNames.length; i++) { paramMap.put(parameterNames[i], args[i]); System.out.println("参数名:"+parameterNames[i]+"\n参数值"+args[i]); } return paramMap; } private static HashMap map = new HashMap () { { put("java.lang.Integer", int.class); put("java.lang.Double", double.class); put("java.lang.Float", float.class); put("java.lang.Long", Long.class); put("java.lang.Short", short.class); put("java.lang.Boolean", boolean.class); put("java.lang.Char", char.class); } };}
aop切面 注解、参数获取
在工作中会经常使用aop,这里将aop使用基本方法,获取在切点中使用的获取参数、注解做一个样例。
1、定义需要切面的注解
@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface AnnDemo { String value(); boolean isAop() default true;}
2、在需要进行切面的方法标注注解
@RestController@RequestMapping("/order")public class OrderController { @Autowired private OrderService orderService; @RequestMapping("/all") @AnnDemo(value = "all",isAop = false) public ListfindAll() { List list = orderService.getOrderList(); return list; } @RequestMapping("/page") @AnnDemo(value = "page") public List findPage(@RequestParam("username") String username) { List listPage = orderService.getOrdersListPage(); return listPage; }}
3、定义切面
在切面中获取切点注解,方法,参数的获取
@Aspect@Componentpublic class AspectDemo { @Pointcut(value = "execution(* com.yin.freemakeradd.controller..*(..))") public void excetionMethod() {} @Pointcut(value = "execution(* com.yin.freemakeradd.controller..*(..)) && @annotation(AnnDemo)") public void excetionNote() { } @Before("excetionMethod()") public void testBefore(JoinPoint joinPoint) { System.out.println("----------------------------前置通知---"); Object[] args = joinPoint.getArgs(); for (Object arg : args) { System.out.println(arg); } } @Around(value = "execution(* com.yin.freemakeradd.controller..*(..)) && @annotation(AnnDemo)") public Object testBeforeNote(ProceedingJoinPoint joinPoint) throws Throwable { //用的最多通知的签名 Signature signature = joinPoint.getSignature(); MethodSignature msg=(MethodSignature) signature; Object target = joinPoint.getTarget(); //获取注解标注的方法 Method method = target.getClass().getMethod(msg.getName(), msg.getParameterTypes()); //通过方法获取注解 AnnDemo annotation = method.getAnnotation(AnnDemo.class); Object proceed; //获取参数 Object[] args = joinPoint.getArgs(); System.out.println(annotation.value()); System.out.println(annotation.isAop()); for (Object arg : args) { System.out.println(arg); } if (Objects.isNull(annotation) || !annotation.isAop()) { System.out.println("无需处理"); proceed = joinPoint.proceed(); }else { System.out.println("进入aop判断"); proceed = joinPoint.proceed(); if(proceed instanceof List){ List proceedLst = (List) proceed; if(!CollectionUtils.isEmpty(proceedLst)){ TbOrder tbOrder = new TbOrder(); tbOrder.setPaymentType("fffffffffffffffffff"); ArrayListtbOrderLst = new ArrayList<>(); tbOrderLst.add(tbOrder); return tbOrderLst; } } System.out.println(proceed); } return proceed; }}
到此,关于"spring通过aop获取方法参数和参数值的方法"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!
参数
方法
注解
切面
面的
学习
类型
切点
更多
封装
帮助
实用
一个样
接下来
基础
文章
现象
理论
目录
知识
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
成都戴尔服务器
哪个二维码识读时需要访问数据库
软件开发是什么词语
软件开发gethap网站
大趋势软件开发
开设网络安全专业的高校
app软件开发项目收入来源
济宁市网络安全局
印象笔记为什么连不上服务器
软件开发有国家报价标准码
访客管理软件开发价位
云服务器大数据集群
江门嵌入式软件开发
手机kms服务器安全吗
node 视频服务器
吴江区品牌网络技术市场价格
靠谱的销售管理软件开发企业
mysql数据库可以写代码么
淄博新火炬软件开发
网络安全意识低的危害
网络安全创新实验
网络安全成本推荐
学校护苗网络安全课总结
网络安全的概念股票
网络安全及信息化工作思考
江门嵌入式软件开发
软件开发涉及的资产评估法条
服务器有问题怎么找网站管理员
阿里时序数据库
杨浦区媒体数据库服务行业