美文网首页SpringSpringJava后台
烂大街的Spring AOP的工作原理你真的了解吗?

烂大街的Spring AOP的工作原理你真的了解吗?

作者: l鹿狸i | 来源:发表于2018-10-23 17:06 被阅读461次

    前言

    大家应该知道AOP编程首先要选择它感兴趣的连接点----即切入点(Point cut),那么,AOP能对切入点做什么样的编程呢? 我们先将代理模式下的某个连接点细化,你会看到如下这个示意图所表示的过程:

    为了降低我们对Spring的AOP的理解难度,我在这里将代理角色的职能进行了简化,方便大家理解。(注意:真实的Spring AOP的proxy角色扮演的只能比这复杂的多,这里只是简化)代理模式的代理角色最起码要考虑三个阶段:

    1. 在调用真正对象的方法之前,应该需要做什么?
    2. 在调用真正对象的方法过程中,如果抛出了异常,需要做什么?
    3. 在调用真正对象的方法后,返回了结果了,需要做什么?

    AOP对这个方法调用的编程,就是针对这三个阶段插入自己的业务代码。

    现在我们假设当前RealSubject这个角色的类是 org.luanlouis.springlearning.aop.FooService ,当前这个连接点对应的方法签名是:public void foo()。那么上述的代理对象的三个阶段将会有以下的处理逻辑:

    1. 在调用真正对象的方法之前
      proxy会告诉Spring AOP: "我将要调用类org.luanlouis.springlearning.aop.FooServicepublic void foo(),在调用之前,你有什么处理建议吗?";

      Spring AOP这时根据proxy提供的类名和方法签名,然后拿这些信息尝试匹配是否在其感兴趣的切入点内,如果在感兴趣的切入点内,Spring AOP会返回 MethodBeforeAdvice处理建议,告诉proxy应该执行的操作;

    2. 在调用真正对象的方法过程中,如果抛出了异常,需要做什么?
      proxy告诉Spring AOP: “我调用类org.luanlouis.springlearning.aop.FooServicepublic void foo()过程中抛出了异常,你有什么处理建议?”

      Spring AOP根据proxy提供的类型和方法签名,确定了在其感兴趣的切入点内,则返回相应的处理建议ThrowsAdvice,告诉proxy这个时期应该采取的操作。

    3. 在调用真正对象的方法后,返回了结果了,需要做什么?
      proxy告诉Spring AOP:"我调用类org.luanlouis.springlearning.aop.FooServicepublic void foo()结束了,并返回了结果你现在有什么处理建议?";

      Spring AOP 根据proxy提供的类型名和方法签名,确定了在其感兴趣的切入点内,则返回AfterReturingAdivce处理建议,proxy得到这个处理建议,然后执行建议;

    因此我给大家推荐一个Java架构群:895244712,里面有分布式,微服务,性能优化等技术点底层原理的视频,也有众多想要提升的小伙伴讨论技术,欢迎大家加群一起交流学习。

    上述的示意图中已经明确表明了Spring AOP应该做什么样的工作:根据proxy提供的特定类的特定方法执行的特定时期阶段给出相应的处理建议。要完成该工作,Spring AOP应该实现:

    1. 确定自己对什么类的什么方法感兴趣? -----即确定 AOP的切入点(Point Cut),这个可以通过切入点(Point Cut)表达式来完成;
    2. 对应的的类的方法的执行特定时期给出什么处理建议?------这个需要Spring AOP提供相应的建议 ,即我们常说的Advice

    原文:https://blog.csdn.net/luanlouis/article/details/51095702

    相关文章

      网友评论

      • Kuchikikakashi:感觉楼主的图画的很好, 可以请教下使用什么画的吗,特别有条理

      本文标题:烂大街的Spring AOP的工作原理你真的了解吗?

      本文链接:https://www.haomeiwen.com/subject/yleazftx.html