1.介绍

  面向切面编程,关注点代码与业务代码分离,就是给指定方法执行前执行后。。插入重复代码

  关注点:重复代码

  切面:被切面的类

  切入点:执行目标对象方法,动态植入切片代码

2.部署步骤

  2.1:添加依赖

  1. <!-- spring aop支持-->
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-aop</artifactId>

  2.2 aop切片配置

  1. package com.ty.tyzxtj.aop;
  2.  
  3. import java.util.HashMap;
  4. import java.util.Map;
  5. import org.aspectj.lang.JoinPoint;
  6. import org.aspectj.lang.annotation.AfterReturning;
  7. import org.aspectj.lang.annotation.Aspect;
  8. import org.aspectj.lang.annotation.Before;
  9. import org.aspectj.lang.annotation.Pointcut;
  10. import org.slf4j.Logger;
  11. import org.slf4j.LoggerFactory;
  12. import org.springframework.stereotype.Component;
  13. import javassist.ClassClassPath;
  14. import javassist.ClassPool;
  15. import javassist.CtClass;
  16. import javassist.CtMethod;
  17. import javassist.Modifier;
  18. import javassist.NotFoundException;
  19. import javassist.bytecode.CodeAttribute;
  20. import javassist.bytecode.LocalVariableAttribute;
  21. import javassist.bytecode.MethodInfo;
  22.  
  23. /**
  24. * 调用接口的切面类
  25. * @author wangjiping
  26. *
  27. */
  28. @Aspect
  29. @Component
  30. public class WebLogAspect {
  31. private Logger logger = null;
  32. /**
  33. * 定义一个切面
  34. */
  35. @Pointcut("execution(* com.ty.tyzxtj.controller.*.*(..))")
  36. public void webLog(){
  37.  
  38. }
  39. @Before("webLog()")
  40. public void doBefore(JoinPoint joinPoint) throws Throwable {
  41. // 接收到请求,记录请求内容
  42. Class<?> target = joinPoint.getTarget().getClass();//目标类
  43. logger = LoggerFactory.getLogger(target);//对应日志成员
  44. String clazzName = target.getName();//类名
  45. Object[] args = joinPoint.getArgs();//参数
  46. String methodName = joinPoint.getSignature().getName();//方法名
  47. Map<String,Object> nameAndArgs = getFieldsName(this.getClass(), clazzName, methodName, args);//获取被切参数名称及参数值
  48. logger.info("["+clazzName+"]["+methodName+"]["+nameAndArgs.toString()+"]");
  49. //获取参数名称和值
  50. }
  51.  
  52. @AfterReturning(returning = "ret", pointcut = "webLog()")
  53. public void doAfterReturning(Object ret) throws Throwable {
  54. // 处理完请求,返回内容
  55. logger.info("response : " + ret);
  56. }
  57.  
  58. /**
  59. * 通过反射机制 获取被切参数名以及参数值
  60. *
  61. * @param cls
  62. * @param clazzName
  63. * @param methodName
  64. * @param args
  65. * @return
  66. * @throws NotFoundException
  67. */
  68. private Map<String, Object> getFieldsName(Class<?> cls, String clazzName, String methodName, Object[] args) throws NotFoundException {
  69. Map<String, Object> map = new HashMap<String, Object>();
  70. ClassPool pool = ClassPool.getDefault();
  71. //ClassClassPath classPath = new ClassClassPath(this.getClass());
  72. ClassClassPath classPath = new ClassClassPath(cls);
  73. pool.insertClassPath(classPath);
  74.  
  75. CtClass cc = pool.get(clazzName);
  76. CtMethod cm = cc.getDeclaredMethod(methodName);
  77. MethodInfo methodInfo = cm.getMethodInfo();
  78. CodeAttribute codeAttribute = methodInfo.getCodeAttribute();
  79. LocalVariableAttribute attr = (LocalVariableAttribute) codeAttribute.getAttribute(LocalVariableAttribute.tag);
  80. if (attr == null) {
  81. }
  82. int pos = Modifier.isStatic(cm.getModifiers()) ? : ;
  83. for (int i = ; i < cm.getParameterTypes().length; i++) {
  84. map.put(attr.variableName(i + pos), args[i]);//paramNames即参数名
  85. }
  86. return map;
  87. }
  88. }

3.注意事项

springboot---aop切片编程的更多相关文章

  1. springBoot AOP切面编程

    AOP 为 Aspect Oriented Programming 的缩写,意为 面向切面编程.AOP 为spring 中的一个重要内容,它是通过对既有程序定义一个切入点,然后在其前后切入不同的执行内 ...

  2. 基于SpringBoot AOP面向切面编程实现Redis分布式锁

    基于SpringBoot AOP面向切面编程实现Redis分布式锁 基于SpringBoot AOP面向切面编程实现Redis分布式锁 基于SpringBoot AOP面向切面编程实现Redis分布式 ...

  3. springBoot AOP学习(一)

    AOP学习(一) 1.简介 AOp:面向切面编程,相对于OOP面向对象编程. Spring的AOP的存在目的是为了解耦.AOP可以让一切类共享相同的行为.在OOP中只能通过继承类或者实现接口,使代码的 ...

  4. Spring:面向切片编程

    在之前我们记录Spring的随笔当中,都是记录的Spring如何对对象进行注入,如何对对象的属性值进行注入,即我们讲解的很大部分都是Spring的其中一个核心概念——依赖注入(或者说是控制翻转,IOC ...

  5. 十:SpringBoot-配置AOP切面编程,解决日志记录业务

    SpringBoot-配置AOP切面编程,解决日志记录业务 1.AOP切面编程 1.1 AOP编程特点 1.2 AOP中术语和图解 2.SpringBoot整合AOP 2.1 核心依赖 2.2 编写日 ...

  6. SpringBoot AOP中JoinPoint的用法和通知切点表达式

    前言 上一篇文章讲解了springboot aop 初步完整的使用和整合 这一篇讲解他的接口方法和类 JoinPoint和ProceedingJoinPoint对象 JoinPoint对象封装了Spr ...

  7. 为了支持AOP的编程模式,我为.NET Core写了一个轻量级的Interception框架[开源]

    ASP.NET Core具有一个以ServiceCollection和ServiceProvider为核心的依赖注入框架,虽然这只是一个很轻量级的框架,但是在大部分情况下能够满足我们的需要.不过我觉得 ...

  8. spring6——AOP的编程术语

    面向切面编程作为一种编程思想,允许我们对程序的执行流程及执行结果动态的做出改变,以达到业务逻辑之间的分层管理或者是目标对象方法的增强,spring框架很好的实现了这种编程思想,让我们可以对主业务逻辑和 ...

  9. springboot+aop切点记录请求和响应信息

    本篇主要分享的是springboot中结合aop方式来记录请求参数和响应的数据信息:这里主要讲解两种切入点方式,一种方法切入,一种注解切入:首先创建个springboot测试工程并通过maven添加如 ...

随机推荐

  1. 如何修改vs2005/vs2010的tfs的登录名和密码 .

    如何修改vs2005/vs2010的tfs的登录名和密码 . 连接TFS时,如果本机保存了用户的网络密码,不会出现用户名和密码的输入框,若要更换TFS的用户名和密码,需按以下步骤操作: 控制面板--- ...

  2. windows下sshfs挂载远程文件夹-server could not connect故障解决

    使用sshfs挂载server上面的文件夹到windows中.轻松方便. 在之前的系统上挂载.没出问题. 近期买了块固态硬盘.装了个系统. 结果在系统上执行sshfs时报例如以下错误: 事实上非常ea ...

  3. java解析xml字符串为实体(dom4j解析)

    package com.smsServer.Dhst; import java.util.HashMap; import java.util.Iterator; import java.util.Ma ...

  4. 一道Google面试题——基数排序思想

    题目描述: 一个大小为n的数组,里面的数都属于范围[0,n-1],有不确定的重复元素,找到至少一个重复元素,要求O(1)空间和O(n)时间. 算法分析: 这个题目要求用O(n)的时间复杂度,这意味着只 ...

  5. AtCoder Express(数学+二分)

    D - AtCoder Express Time limit : 2sec / Memory limit : 256MB Score : 400 points Problem Statement In ...

  6. Velocity模版引擎使用总结

    Velocity是一个基于java的模板引擎.它允许任何人仅仅简单的使用模板语言来引用由java代码定义的对象. 当Velocity应用于web开发时,界面设计人员可以和java程序开发人员同步开发一 ...

  7. 一个有趣的IP不同的问题?

    1.我们已经知道了内网和外网的显示是不同的. 2.今天发现了我的飞Q传输上显示的ip和电脑上网络中显示的ip不同,但是传输文件是可以的,至于这个问题目前没有找到合理的解释,解释这个问题,但是这样就奇怪 ...

  8. Java里的4种引用类型

    Java语言中,除了基本数据类型外,其他的都是指向各类对象的对象引用:Java中根据其生命周期的长短,将引用分为4类. 1 强引用 特点:我们平常典型编码Object obj = new Object ...

  9. kubernetes 1.7.2 安装 记录过程

    系统信息 cat /etc/redhat-release CentOS Linux release (Core) 环境信息 IP地址 主机名称 10.10.6.11 master 10.10.6.12 ...

  10. 021-Spring Boot 测试,Junit方式使用,mock方式,Controller测试

    一.概述 二.Junit方式使用 2.1.基本使用 eclipse在新建的类上,右键→new→Junit Test Case,修改一下Source folder,选择src/test/java,下一步 ...