面向切面AOP的相关操作

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: AOP中关键性概念 连接点(Joinpoint):程序执行过程中明确的点,如方法的调用,或者异常的抛出.通知(Advice):在某个特定的连接点上执行的动作代理(Proxy):将通知(公共部分的代码,日志记录)应用到目标(具体的业务逻辑方法)对象后创建的对象(代理=目标+通知),切入点(Pointcut):多个连接点的集合,定义了通知应该应用到那些连接点。适配器(Advisor):适配器=通知(Advice)+切入点(Pointcut)

AOP中关键性概念
连接点(Joinpoint):程序执行过程中明确的点,如方法的调用,或者异常的抛出.

目标(Target):被通知(被代理)的对象
注1:完成具体的业务逻辑

通知(Advice):在某个特定的连接点上执行的动作,同时Advice也是程序代码的具体实现,例如一个实现日志记录的代码(通知有些书上也称为处理)
注2:完成切面编程

代理(Proxy):将通知(公共部分的代码,日志记录)应用到目标(具体的业务逻辑方法)对象后创建的对象(代理=目标+通知),

         例子:外科医生+护士

注3:只有代理对象才有AOP功能,而AOP的代码是写在通知的方法里面的

切入点(Pointcut):多个连接点的集合,定义了通知应该应用到那些连接点。

             (也将Pointcut理解成一个条件 ,此条件决定了容器在什么情况下将通知和目标组合成代理返回给外部程序)

适配器(Advisor):适配器=通知(Advice)+切入点(Pointcut)

如何实现AOP
目标对象只负责业务逻辑代码
通知对象负责AOP代码,这二个对象都没有AOP的功能,只有代理对象才有

  1. AOP
    即面向切面编程
  2. AOP带来的好处
    让我们可以 “专心做事”

    连接点、目标、通知、代理
    当方法被调用时,AOP将通知应用到目标上所创建的对象叫代理
    代理=目标+通知,只有完整的代理对象才具备AOP特性,而AOP代码是写在通知中的。

    案例:
    public void doSameBusiness (long lParam,String sParam){

    <--------------------- AOP
    //日志记录

    // 输入合法性验证
    if (lParam<=0){

       throws new IllegalArgumentException("xx应该大于0");

    }
    if (sParam==null || sParam.trim().equals("")){

       throws new IllegalArgumentException("xx不能为空");

    }
    // 异常处理
    try{
    ... //核心业务逻辑
    }catch(...){
    }catch(...){
    }
    // 事务控制
    tx.commit();
    }

    例子:病人做手术

    外科医生+护士

    主刀医生:理解为AOP中的目标,专注具体的业务逻辑操作
    麻醉师和护士:理解为AOP中的通知,在某种特定的连接点上执行的动作
    上述结合:AOP 代理对象:将通知应用到具体目标对象后创建对象
    代理=目标+通知
    只有代理对象才有AOP功能。

3 工具类org.springframework.aop.framework.ProxyFactoryBean用来创建一个代理对象,在一般情况下它需要注入以下三个属性:
proxyInterfaces:代理应该实现的接口列表(List)
interceptorNames:需要应用到目标对象上的通知Bean的名字。(List)
target:目标对象 (Object)

  1. 前置通知(org.springframework.aop.MethodBeforeAdvice):在连接点之前执行的通知()
    案例:在购书系统当中使用AOP方式实现日志系统
  2. 后置通知(org.springframework.aop.AfterReturningAdvice):在连接点正常完成后执行的通知
    案例:在线购书系统中,要求不修改BookBizImpl代码的情况下增加如下功能:对买书的用户进行返利:每买本书返利3元。(后置通知)

     即:每调用一次buy方法打印:“[销售返利][时间]返利3元。”
    
  1. 环绕通知(org.aopalliance.intercept.MethodInterceptor):包围一个连接点的通知,最大特点是可以修改返回值,由于它在方法前后都加入了自己的逻辑代码,因此功能异常强大。

          它通过MethodInvocation.proceed()来调用目标方法(甚至可以不调用,这样目标方法就不会执行)

    案例:修改日志系统不光要输出参数,还要输出返回值(环绕通知)

这个接口里面没有定义方法,我们要求我们的类必须实现afterThrows这个方法

public void afterThrowing( [Method method,] [Object args,] [Object target,] Throwable throwable );

前面三个参数都是可选的,只有第三个参数是必须的,同时我们还可以在同一个类中定义这个方法的多个版本,如:

public void afterThrowing( MyException1 ex ) {}

public void afterThrowing( MyException2 ex ) {}

具体那个方法被调用则根据具体的Exception来判断,由AOP容器自动识别 执行

  1. 异常通知(org.springframework.aop.ThrowsAdvice):这个通知会在方法抛出异常退出时执行
    案例: 书本价格为负数时抛出一个异常,通过异常通知取消此订单
  2. 适配器(org.springframework.aop.support.RegexpMethodPointcutAdvisor) 适配器=通知(Advice)+切入点(Pointcut)
    案例:通过适配器解决发书评时也返利的问题
    .*buy
  3. 请使用接口接收返回的代理对象
    A

    B C 里氏替换原则

    A:IBookBiz
    B:BookBizImpl implements IBookBiz
    C:Proxy implements IBookBiz

    IBookBiz bookBiz=new BookBizImpl();
    IBookBiz bookBiz=new Proxy();

    BookBizImpl bookBiz=(BookBizImpl)proxy;

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
3月前
|
前端开发 Java 数据库
浅谈Spring AOP 面向切面编程 最通俗易懂的画图理解AOP、AOP通知执行顺序~
浅谈Spring AOP 面向切面编程 最通俗易懂的画图理解AOP、AOP通知执行顺序~
|
11天前
|
Java Spring XML
掌握面向切面编程的秘密武器:Spring AOP 让你的代码优雅转身,横切关注点再也不是难题!
【8月更文挑战第31天】面向切面编程(AOP)通过切面封装横切关注点,如日志记录、事务管理等,使业务逻辑更清晰。Spring AOP提供强大工具,无需在业务代码中硬编码这些功能。本文将深入探讨Spring AOP的概念、工作原理及实际应用,展示如何通过基于注解的配置创建切面,优化代码结构并提高可维护性。通过示例说明如何定义切面类、通知方法及其应用时机,实现方法调用前后的日志记录,展示AOP在分离关注点和添加新功能方面的优势。
24 0
|
2月前
|
Java Spring 容器
Spring问题之Spring AOP是如何实现面向切面编程的
Spring问题之Spring AOP是如何实现面向切面编程的
|
2月前
|
设计模式 缓存 程序员
Spring6(三):面向切面AOP(1)
Spring6(三):面向切面AOP(1)
28 1
|
4月前
|
Java 开发者 Spring
面向切面编程(SpringAOP)、通过注解实现AOP代码、AOP的工作流程
面向切面编程(SpringAOP)、通过注解实现AOP代码、AOP的工作流程
51 1
面向切面编程(SpringAOP)、通过注解实现AOP代码、AOP的工作流程
|
3月前
|
XML Java 程序员
Java一分钟之-AOP:面向切面编程
【6月更文挑战第13天】Java中的AOP允许程序员定义切面,将日志、事务等通用功能与业务逻辑解耦。切面包括通知(Advice,如前置、后置等)和切入点(Pointcut,定义执行点)。Spring框架通过代理和@AspectJ注解支持AOP。常见问题包括代理对象理解错误、切入点表达式错误、环绕通知处理不当和配置遗漏。理解和实践中,AOP能提升代码可维护性和可扩展性。
56 5
|
2月前
|
Java Spring
Spring AOP(面向切面编程)详解
Spring AOP(面向切面编程)详解
|
2月前
|
XML Java 数据格式
Spring6(三):面向切面AOP(3)
Spring6(三):面向切面AOP(3)
19 0
|
2月前
|
SQL 安全 Java
Spring6(三):面向切面AOP(2)
Spring6(三):面向切面AOP(2)
20 0
|
3月前
|
XML Java 数据格式
Spring5系列学习文章分享---第三篇(AOP概念+原理+动态代理+术语+Aspect+操作案例(注解与配置方式))
Spring5系列学习文章分享---第三篇(AOP概念+原理+动态代理+术语+Aspect+操作案例(注解与配置方式))
34 0