Spring(五)Spring AOP--关于面向切面编程的理解

一、AOP的概念

  •  AOP(Aspect-oriented programming,面向切面编程)。 将应用程序中的交叉业务逻辑(事务、安全等等) 提取出来, 封装成切面。 由 AOP 容器在适当的时机(编译或运行时), 将这些切面动态织入到具体业务逻辑当中。将程序当中交叉业务抽象成切面,然后动态的应用到具体业务逻辑代码之中。 从而实现切面的复用,并且解耦了交叉业务逻辑代码与具体业务逻辑代码。

  • AOP采取横向抽取机制,取代了传统纵向继承体系重复性代码(性能监视、事务管理、安全j检查、缓存)

  • Spring AOP使用纯Java实现,不需要专门的编译和类加载器,在运行期通过代理方向目标类织入增强代码。

    这么说会有点抽象,下面通过例子来帮助理解一下:

假设有三个类A、B、C,它们有各自的方法。

Spring(五)Spring AOP--关于面向切面编程的理解

可以发现它们有相同的方法 xx() 和 xxx()。为了代码的简洁性,可以把它们提出来并且封装成一个新方法 x()。

以后要用xx()或者xxx()只需要调用 x() 。 这称为面向对象。

Spring(五)Spring AOP--关于面向切面编程的理解

但是如果把 x() 改名了,改成  y()  ,那么调用此方法的类的语句都需要改。这是弊端之一。

还有的缺点就是方法执行的顺序。比如想让 x() 在第二次执行,也需要调换每个类中的位置。如果有几百个类,那么这样的工作量可想而知。

那么AOP是如何实现这个逻辑呢?假如还是封装了 x()。当A、B、C还是要执行 x()的时候,不需要调用,可以直接渗透(切入)进去。但是要说明清楚,即在什么地方或者什么时候切入进去。这时候就要定义一个切入点。

假设切入点:每次调用run()之后执行x()。

这样的好处就出来了:如果把 x() 改名了或者方法执行的顺序改变了,只需要在切入点声明即可。这就是面向切面。

 

二、AOP的相关术语

  1. Aspect(切面):泛指交叉业务逻辑, 对交叉业务逻辑的统称,是对交叉业务逻辑的抽象。

  2. Advice(通知):建议/通知, 指具体的交叉业务逻辑, 切面的具体实现。

  3. Joinpoint(连接点):连接点, 是指切面代码可以被织入到目标对象的位置(属性、方法)。

  4. Pointcut(切入点):切入点, 指切面具体应用的位置,具体可以插入到哪些类,哪些方法当中。 通知应用到哪些类的哪些方法或属性之上的规则,更加具体。

  5. Introduction(引入):引入,指动态地给 Bean 类增加属性和方法的一种特殊的通知。

  6. Target(目标对象):目标对象,指切面应用到的对象。

  7. Proxy(代理对象):代理对象,指切面应用到目标对象之后形成的对象。

  8. Weaving(织入):织入, 将切面代码插入到业务逻辑代码的过程。
    (1) 编译时织入,要有特殊的编译器支持, 如 ASpectJ。
    优点就是性能好,速度快。
    (2) 在运行时,使用动态代理机制。
    把切面代码插入目标对象中,形成动态代理机制。
    实现简单点,但性能差些。