day09-2022-02-24

湖南

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值),数字类型值越小优先级越高

posted @ 2022-02-24 20:46  elliottmoo  阅读(22)  评论(0编辑  收藏  举报