Spring:AOP

动态代理编程【Aspect Oriented Programming, AOP,面向切面编程】

  • @Trancactional:事务的底层逻辑就是AOP

  • 概念【动态代理,最后IOC自动注入的是代理对象】:

    • 连接点:被aop获取的方法的相关信息;

    • 通知:aop函数,扩展逻辑;

    • 切入点:aop方法获取的匹配条件;

    • 切面:通知所在的类;

    • 目标对象:方法

  • 通知类型【函数的逻辑类型】,对原有方法进行扩展【类似于拦截器】:

    • @Around:环绕通知
      • 运行方法开始前逻辑;
      • 运行原始方法;
      • 运行方法后的逻辑;
    • @Before:前置通知;
    • @After:后置通知,无论是否有异常都会执行;
    • @AfterReturning:返回后通知,有异常不会执行;
    • @AfterThrowing:异常通知,异常发生后执行;
  • 通知顺序【通知的多层嵌套通知】:

    • 对于相同类型的通知,通知通知顺序和类名【字符串】顺序有关;
      • 前置通知,呈递增【字符串】形式执行;
      • 后置通知,呈递减【字符串】形式执行【为了和前置形成对照】;
      • 也可也通过注解@Order(数字)来控制顺序,和字符串排序相同;
  • 原始方法的获取或者定位;

    • 切入点表达式:@Pointcut("切入点表达式")
      • 根据方法的签名:execution(...):
        • 语法:execution(访问修饰符? 返回值 包名.类名.?方法名(方法参数) throws 异常?)【这就是在函数头上加入包名和类名】;
        • ?可以省略:访问修饰符,包名.类名【就是方法声明了】,throws 异常;【返回值 + 方法名 + 参数类型】
        • execution(返回值 包名.类名(方法参数);
        • 通配符号:
          • *:可以匹配任意一个参数;
          • ··:可以匹配任意个连续的任意符号;
        • 切入点表达式,可以加入逻辑运算符;
        • 采用通过接口进行描述,方便扩展;
      • 根据注解@annotation(...)
        • 用于匹配有特定注解的方法;
        • @Pointcut("@annotation(自定义注解类的包名.类名)"),会自动识别标注了注解类的方法;
    • Spring中使用JoinPointdu抽象了连接点:
      • @Aound的通知,获取连接点,ProceedingJoinPoint;
      • 其他四类:JoinPoint【ProceedingJoinPoint是JoinPoint子类】;
      • 能够获取:类名,方法名,方法传入参数,方法返回值,
posted @ 2025-03-26 11:45  烟雨断桥  阅读(16)  评论(0)    收藏  举报