烂大街的Spring AOP的工作原理你真的了解吗?
前言
大家应该知道AOP编程首先要选择它感兴趣的连接点----即切入点(Point cut),那么,AOP能对切入点做什么样的编程呢? 我们先将代理模式下的某个连接点细化,你会看到如下这个示意图所表示的过程:
为了降低我们对Spring的AOP的理解难度,我在这里将代理角色的职能进行了简化,方便大家理解。(注意:真实的Spring AOP的proxy角色扮演的只能比这复杂的多,这里只是简化)代理模式的代理角色最起码要考虑三个阶段:
- 在调用真正对象的方法之前,应该需要做什么?
- 在调用真正对象的方法过程中,如果抛出了异常,需要做什么?
- 在调用真正对象的方法后,返回了结果了,需要做什么?
AOP对这个方法调用的编程,就是针对这三个阶段插入自己的业务代码。
现在我们假设当前RealSubject这个角色的类是 org.luanlouis.springlearning.aop.FooService
,当前这个连接点对应的方法签名是:public void foo()
。那么上述的代理对象的三个阶段将会有以下的处理逻辑:
-
在调用真正对象的方法之前,
proxy会告诉Spring AOP: "我将要调用类org.luanlouis.springlearning.aop.FooService
的public void foo()
,在调用之前,你有什么处理建议吗?";Spring AOP这时根据proxy提供的类名和方法签名,然后拿这些信息尝试匹配是否在其感兴趣的切入点内,如果在感兴趣的切入点内,Spring AOP会返回 MethodBeforeAdvice处理建议,告诉proxy应该执行的操作;
-
在调用真正对象的方法过程中,如果抛出了异常,需要做什么?
proxy告诉Spring AOP: “我调用类org.luanlouis.springlearning.aop.FooService
的public void foo()
过程中抛出了异常,你有什么处理建议?”Spring AOP根据proxy提供的类型和方法签名,确定了在其感兴趣的切入点内,则返回相应的处理建议ThrowsAdvice,告诉proxy这个时期应该采取的操作。
-
在调用真正对象的方法后,返回了结果了,需要做什么?
proxy告诉Spring AOP:"我调用类org.luanlouis.springlearning.aop.FooService
的public void foo()
结束了,并返回了结果你现在有什么处理建议?";Spring AOP 根据proxy提供的类型名和方法签名,确定了在其感兴趣的切入点内,则返回AfterReturingAdivce处理建议,proxy得到这个处理建议,然后执行建议;
因此我给大家推荐一个Java架构群:895244712
,里面有分布式,微服务,性能优化等技术点底层原理的视频,也有众多想要提升的小伙伴讨论技术,欢迎大家加群一起交流学习。
上述的示意图中已经明确表明了Spring AOP应该做什么样的工作:根据proxy提供的特定类的特定方法执行的特定时期阶段给出相应的处理建议。要完成该工作,Spring AOP应该实现:
- 确定自己对什么类的什么方法感兴趣? -----即确定 AOP的切入点(Point Cut),这个可以通过切入点(Point Cut)表达式来完成;
- 对应的的类的方法的执行特定时期给出什么处理建议?------这个需要Spring AOP提供相应的建议 ,即我们常说的Advice。