当前位置 > it书童 > java > 正文
推荐小册
java高效编程
怎样更高效地用 java 编程

juc并发工具库
java并发编程工具库

设计模式
设计模式

jvm调优
jvm调优

rabbitmq实战
rabbitmq实战

redis实战
redis实战

Keepavlied高可用集群
Keepavlied高可用集群

nginx入门到实战
nginx入门到实战

java调试
java调试中遇到的各种坑

java输入输出流
java输入输出流

spring 面向切面 AOP 介绍

java it书童 2020-08-20 21:06:18 0赞 0踩 399阅读 0评论

AOP 是什么

AOP: 全称是 Aspect Oriented Programming 即:面向切面编程。这是一个很邪乎的概念,看专业术语,越看越懵

简单的说它就是把我们程序重复的代码抽取出来,在需要执行的时候,使用动态代理的技术,在不修改源码的 基础上,对我们的已有方法进行增强。

作用: 在程序运行期间,不修改源码对已有方法进行增强。

优势:

  • 减少重复代码

  • 提高开发效率

  • 维护方便

Spring 中的 AOP

spring 使用事务实现转账小案例 的源码为例

首先理解 AOP 相关术语

  • Joinpoint(连接点)

所谓连接点是指那些被拦截到的点。在 spring 中,这些点指的是方法, 因为 spring 只支持方法类型的连接点。

service/IAccountService.java 中的方法,由于都会被动态代理拦截到,因此都是连接点

  • Pointcut(切入点)

所谓切入点是指我们要对哪些 Joinpoint 进行拦截的定义。

通俗地讲,就是指在动态代理中被增强的方法。如果一个方法在动态代理中没有被增强,那么这种方法是连接点,但并不是切入点

如:

// 没被增强,因此 test 方法不是切入点。
// 所有的切入点都是连接点,但并不是所有的连接点都是切入点
if("test".equals(method.getName())){
    return method.invoke(accountService,args);
}
  • Advice(通知/增强)

所谓通知是指拦截到 Joinpoint 之后所要做的事情就是通知。

通知的类型:前置通知,后置通知,异常通知,最终通知,环绕通知。

  • Introduction(引介)

引介是一种特殊的通知在不修改类代码的前提下, Introduction 可以在运行期为类动态地添加一些方法或 Field。

  • Target(目标对象)

代理的目标对象

  • Weaving(织入)

是指把增强应用到目标对象来创建新的代理对象的过程。

spring 采用动态代理织入,而 AspectJ 采用编译期织入和类装载期织入。

  • Proxy(代理)

一个类被 AOP 织入增强后,就产生一个结果代理类。

  • Aspect(切面)

是切入点和通知(引介)的结合。

spring AOP 的开发流程

开发阶段(程序员完成):

  • 编写核心业务代码

  • 把公用代码抽取出来,制作成通知

  • 在配置文件中,声明切入点与通知间的关系,即切面

运行阶段(Spring 框架完成的)

Spring 框架监控切入点方法的执行。一旦监控到切入点方法被运行,使用代理机制,动态创建目标对象的代理对象,根据通知类别,在代理对象的对应位置,将通知对应的功能织入,完成完整的代码逻辑运行

关于我
一个文科出身的程序员,追求做个有趣的人,传播有价值的知识,微信公众号主要分享读书思考心得,不会有代码类文章,非程序员的同学请放心订阅
转载须注明出处:https://www.itshutong.com/articles/651/introduction-to-aspect-oriented-aop-of-spring