• SpringBoot实现AOP详解


    SpringBoot实现AOP详解

    1. Spring框架实现AOP

    • 首先我们知道
    • Aspect(切面) === Advice(通知) + PointCut(切入点)
    • Advice(通知): 业务逻辑中一些附加操作称之为通知,可分为前置,后置,环绕,异常,最终。
    • PointCut(切入点):配置通知应用于项目中的具体哪些操作

    1.1 类 implement xxAdvice接口

    1.2 xml进行配置

    
    
        
        
        
        
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    2. SpringBoot配置AOP的方式

    2.1  主要是对现有的spring框架进行封装

    • 无xml配置,一切都是java进行配置

    • AOP:面向切面

    • Aspect(切面) === Advice(通知) + PointCut(切入点)

    • 所以仍要需要做的两件事:

      • 开发附加操作(通知)Advice
      • 配置切入点 &组装切面

    2.2 面向切面编程的步骤

    • 引入aop切面的编程依赖

      org.springframework.boot spring-boot-starter-aop
    • 在SpringBoot中新建MyAdviceConfig配置类

      package com.liu.aop.config;

      import org.aspectj.lang.JoinPoint;
      import org.aspectj.lang.ProceedingJoinPoint;
      import org.aspectj.lang.annotation.After;
      import org.aspectj.lang.annotation.Around;
      import org.aspectj.lang.annotation.Aspect;
      import org.aspectj.lang.annotation.Before;
      import org.springframework.context.annotation.Configuration;

      // 表示当前的类是一个配置类
      @Configuration
      //该注解只能用在类上,作用:代表当前类是一个切面类,等价于spring.xml中的aop:config标签
      //所以现在有了aop:config切面,还需要 通知 + 切入点
      // 切面 == 通知 + 切面
      @Aspect
      public class MyAdviceConfig {

      /**
       * @param joinPoint
       * @Before:前置通知 
       * value:切入点表达式  二者加起来构建成为一个切面
       * JoinPoint:连接点:可以理解为两个圆形的切点,从这个切点就可以获取到当前执行的目标类及方法
       * 前置通知和后置通知的参数的都是 JoinPoint, 前置后置通知都没有返回值
       */
      // 方法级别:具体到某个具体的方法
      // @Before(value = "execution(* com.liu.aop.service.impl.*.*(..))")
      // 表示service包下的所有类所有方法都执行该前置通知
      @Before(value = "within(com.liu.aop.service.*)")
      public void before(JoinPoint joinPoint) {
          System.out.println("before开始执行查询.......");
          System.out.println("正在执行的目标类是: " + joinPoint.getTarget());
          System.out.println("正在执行的目标方法是: " + joinPoint.getSignature().getName());
      }
      
      /**
       * 后置通知,属性参数同上面的前置通知
       * @param joinPoint 前置通知和后置通知独有的参数
       */
      @After(value = "execution(* com.liu.aop.service.impl.*.*(..))")
      public void after(JoinPoint joinPoint) {
          System.out.println("after查询结束.......");
          // 获取执行目标类和方法名等等
      }
      
      /**
       * @param proceedingJoinPoint 环绕通知的正在执行中的连接点(这是环绕通知独有的参数)
       * @return 目标方法执行的返回值
       * @Around: 环绕通知,有返回值,环绕通知必须进行放行方法(就相当于拦截器),否则目标方法无法执行
       */
      @Around(value = "execution(* com.liu.aop.service.impl.*.*(..))")
      public Object aroud(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
          System.out.println("aroud环绕通知开始.......");
          System.out.println("执行的目标类 = " + proceedingJoinPoint.getTarget());
          System.out.println("执行的目标方法 = " + proceedingJoinPoint.getSignature().getName());
          // 必须方法目标方法
          Object proceed = proceedingJoinPoint.proceed();
          System.out.println("aroud环绕通知结束.......");
          // 将目标方法的返回值进行返回,否则调用目标方法的方法无法获取到返回值
          return proceed;
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
      • 40
      • 41
      • 42
      • 43

      }

    先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦

  • 相关阅读:
    一条 sql 了解 MYSQL 的架构设计
    抖音上的影视解说是怎么配音的?
    猿创征文|一篇打通架构设计,Java设计模式10,建造者模式
    为什么计算机对浮点型数字计算存在误差
    基于springboot的药品管理
    excel提取某列字符串数据
    python中protobuf和json互相转换应用
    神经网络和AI的关系
    遥控车模的电机控制器
    大数据-之LibrA数据库系统告警处理(ALM-12057 元数据未配置周期备份到第三方服务器的任务)
  • 原文地址:https://blog.csdn.net/m0_67401660/article/details/126114588