SpringSpringJava后台

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

2018-10-23  本文已影响461人  l鹿狸i

前言

大家应该知道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

上一篇下一篇

猜你喜欢

热点阅读