https://www.cnblogs.com/hejj-bk/p/11496505.html

ASM是一套JAVA字节码生成架构。它可以动态生成二进制格式的stub类或其他代理类,或者在类被JAVA虚拟机装入内存之前,动态修改类。
image.png
重新生成或者在原来的class文件基础之上,直接添加日志处理的相关逻辑即可

image.png
切点:方法中可以插入代码的位置:(核心代码的)前面、(核心代码的)后面、异常后面、返回值后面
通知(advice):几个位置插入的代码叫做通知
切面:切面是通知和切点的结合,通知和切点共同定义了切面的全部内容。因为通知定义的是切面的
“要做什么”和”在何时做”,而切点定义的是切面的”在何地做”。将两者结合在一起,就可以完美的
展现切面在何时,何地,做什么(功能)。
横切关注点:对哪些方法进行拦截,
连接点:被拦截到的点,因spring只支持方法类型的连接点,所以spring连接点即为被拦截的方法,实际上还可以是字段或者是构造器
织入:将切面(切点和通知)应用于目标对象并创建代理对象的过程

InvocationHandler—>jdk动态代理
image.png

例子

  1. @Aspect
  2. public class TransactionDemo {
  3. @Pointcut(value="execution(* com.yangxin.core.service.*.*.*(..))")
  4. public void point(){
  5. }
  6. //法一
  7. @Before(value="point()")
  8. public void before(){
  9. System.out.println("transaction begin");
  10. }
  11. //法二
  12. public void before("execution(* com.yangxin.core.service.*.*.*(..))"){
  13. System.out.println("transaction begin");
  14. }
  15. @AfterReturning(value = "point()")
  16. public void after(){
  17. System.out.println("transaction commit");
  18. }
  19. @Around("point()")
  20. public void around(ProceedingJoinPoint joinPoint) throws Throwable{
  21. System.out.println("transaction begin");
  22. joinPoint.proceed();
  23. System.out.println("transaction commit");
  24. }
  25. }