• day0920220224


    湖南

    AOP

    操作术语

    1. 连接点
      类里面哪些方法可以被增强,这些方法称为连接点
    2. 切入点
      实际被真正增强的方法,称为切入点
    3. 通知(增强)
      (1)实际增强的逻辑部分称为通知(增强)
      (2)通知有多种类型
      前置通知
      后置通知
      环绕通知
      异常通知
      最终通知
    4. 切面
      把通知应用到切入点的过程(是动作)

    AOP操作(准备)

    1. Spring框架一般都是基于AspectJ来实现AOP操作
      什么是AspectJ?
      AspectJ不是Spring组成部分,它是独立的AOP框架,一般把AspectJ和Spring框架一起使用,进行AOP操作
    2. 基于AsprctJ实现AOP操作
      (1)基于XML配置文件
      (2)基于注解方式实现(使用)
    3. 在项目工程里面引入AOP相关依赖
    4. 切入点表达式
      (1)切入点表达式作用,知道对哪个类里面的哪个方法进行增强
      (2)语法结构:
      execution([权限修饰符][返回类型][类全路径][方法名称][参数列表])

    举例1:对com.jt.dao.BookDao类里面的add进行增强
    execution(*com.jt.dao.BookDao.add(..))

    举例2:对com.jt.dao.BookDao类里面的所有进行增强
    execution(com.jt.dao.BookDao.(..))

    举例3:对com.jt.dao包里面的所有类,类里面所有方法进行增强
    execution(com.jt.dao..*(..))

    AOP操作(AspectJ注解)

    1. 创建类,在类里面定义方法
    2. 创建增强类(编写增强逻辑)
      (1)在增强类里面,创建方法,让不同方法代表不同通知类型
    3. 进行通知的配置
      (1)在spring的配置文件中,开启注解扫描

      (2)使用注解创建User和UserProxy对象


      (3)在增强类上面添加注解@Aspect

      (4)在spring配置文件中开启生成代理对象
    4. 配置不同类型的通知
      (1)在增强类的里面,在作为通知方法上面添加通知类型注解,使用切入点表达式配置
    5. 测试

      输出结果
    6. 几种不同的类型通知
    package com.jt.demo4.aopanno;
    
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.*;
    import org.springframework.stereotype.Component;
    
    //增强的类
    @Component
    @Aspect//生成代理对象
    public class UserProxy {
        //前置通知
        //@Before注解表示作为前置通知
        @Before("execution(* com.jt.demo4.aopanno.User.add(..))")
        public void before(){
            System.out.println("before....");
        }
    
        @AfterReturning("execution(* com.jt.demo4.aopanno.User.add(..))")
        public void afterReturning(){
            System.out.println("afterReturning....");
        }
    
        @After("execution(* com.jt.demo4.aopanno.User.add(..))")
        public void after(){
            System.out.println("after....");
        }
    
        @AfterThrowing("execution(* com.jt.demo4.aopanno.User.add(..))")
        public void afterThrowing(){
            System.out.println("afterThrowing....");
        }
    
        //环绕通知(会在方法之前和方法之后都执行)
        @Around("execution(* com.jt.demo4.aopanno.User.add(..))")
        public void around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
            System.out.println("环绕之前....");
            //被增强的方法执行
            proceedingJoinPoint.proceed();
            System.out.println("环绕之后....");
        }
    }
    
    

    输出结果

    1. 相同的切入点抽取
    2. 有多个增强类对同一个方法进行增强,可以设置增强类的优先级
      (1)在增强类的上面添加注解@Order(int值),数字类型值越小优先级越高

  • 相关阅读:
    LeetCode:1_Two_Sum | 两个元素相加等于目标元素 | Medium
    算法导论第十章 栈队列和链表
    算法导论2-9章补充几道题
    算法导论第九章中位数和顺序统计量(选择问题)
    算法导论第八章线性时间排序
    算法导论第七章快速排序
    算法导论第六章优先队列(二)
    算法导论第六章堆排序(一)
    mysql中查看视图的元数据?
    mysql中,什么是视图,视图的作用是什么?
  • 原文地址:https://www.cnblogs.com/elliottmoo/p/15933505.html
Copyright © 2020-2023  润新知