Spring框架总结之面向切面(一)

来源:互联网 发布:js日期格式化yyyymmdd 编辑:程序博客网 时间:2024/06/18 00:25

Spring框架总结之面向切面(一)

 

AOP(Aspect Oriented Programming),称之为“面向切面编程”,它是Spring框架的又一核心模块,与其支持的DI功能同样处于重要地位。相比于Java传统的继承体系(柱体体系结构),AOP则实现了横向切割程序生产线,产生若干切面体,而每个切面体含有特定的横切动作、目标对象及触发动作的契机点,触发之后,在横向实现了各种方式的非业务相关的动作,将业务和非业务模块分离,一般用来处理日志、缓存、事务及其它非业务通用部分功能。而AOP的实现机制,实际上是通过代理方式实现,那么接下来从AOP的基本原理、实现方式、横切时机及切点表达式四方面介绍,后续文章会以实例详细介绍AOP的使用。

 

l  AOP基本原理

l  AOP实现方式

l  AOP横切时机

l  AOP切点表达式

 

 

一、AOP基本原理

正如上图所示,我们使用约定熟成的几个术语来形象地描述AOP的基本原理及构成。我们知道Spring的AOP机制是基于代理(Proxy)实现的,也就是面向切面编程中的切面(Aspect)是嵌入或由代理对象来实现,而最终需要把切面织入到目标对象(Bean)中,待该Bean中的某些条件满足时,采取执行指定的横切行为。

如上图,我们知道Aspect是由通知(Advice)和切入点(Pointcut)共同组成,前者描述了通知的内容和行为,后者则来控制有哪些链接点(Join point)能够匹配切面的条件,而这些连接点一般位于目标对象中已存在的动作标志,如:方法、属性域及构造器等。当应用程序的某些Bean被实例化后,AOP会将相关的Proxy实现的Aspect织入到该Bean中,待它满足条件被触发时,即会执行织入其中的切面行为,将某点的行为逻辑,横切出当前应用线程,开辟一新的线程来完成相关的AOP功能,这就是AOP的基本原理。

 

 

二、AOP实现方式

我们知道,不是所有的AOP框架都相同的,它们在连接点模型上可能有强弱之分。有些允许在字段区域,有些则只支持在方法上的连接点支持,而它们织入切面的方式和时机也不同。但不管怎样,创建切点来定义切面所织入的连接点是AOP框架的基本功能。

 

在Spring中,提供了4种类型的AOP支持,它们分别为:基于代理的经典Spring AOP、POJO切面、基于Aspect注解切面及注入式AspectJ切面。前三者为Spring AOP实现的变体,而Spring AOP构建在动态代理基础之上,所以它仅局限在对方法的拦截实现。

 

对于第1种aop,这里不做详细介绍,因为它直接使用ProxyFactory Bean,操作繁琐并且性能比较差;

 

对于第2种aop,它借助于Spring的aop命名空间,将纯POJO对象转为切面。而这些切面只提供了满足切点条件时所调用的方法,并且需要在 xml中声明实现,方式比较单一。

 

对于第3种aop,Spring借助了AspectJ的切面实现,以提供注解驱动的切面。实际上,它依然是Spring基于代理方式的AOP,只是编程模式与成熟的AspectJ注解切面相同,它不需要使用xml来实现。

 

对于第4中aop,如果我们需要不仅仅在方法上拦截动作,还需要在属性和构造方法中拦截,那么就需要使用这种方式。大多情况下,AspectJ注解切面与Spring的AOP相互独立,我们可以单单使用AspectJ注解来实现Aop的功能,不需要借助Spring,但这里我们讨论的是Spring,所以这里主要介绍第2、3种的实现,对于AspectJ的AOP,这里不做详细介绍。

 

 

三、AOP横切时机

在Spring的AOP中,最为常用的横切时机共4种,分别为切点执行前(@Before)、切点执行后(@After及@AfterReturing)、抛出异常时(@AfterThrowing)、环绕通知(@Round)及它们的结合体。

 

1、@Before

在连接点动作执行之前执行的横切逻辑行为。

 

2、@After及@AfterReturing

在连接点动作执行之后执行的横切逻辑行为,不同的是@After没有返回值,而@AfterReturning有返回值。

 

3、@AfterThrowing

在连接点动作执行之后,触发异常动作时,触发的动作,常用来解决异常信息的捕获及处理。

 

4、@Round

在连接点动作执行前、后及异常时都发生,也就是包括了前面三种类型动作的横切行为。

 

 

默认情况下,Spring AOP并未被启用,我们需要开启它。因为Spring AOP基于代理实现,所以Spring提供了自动代理开关来开启AOP,具体在后续文章会罗列出来,这里不赘述。

 

 

四、AOP切点表达式

1、切点表达式

 

如上图所示,具体内容请参看图中说明。

 

2、切面定义样例

这里以Spring Aspect注解AOP声明为例来定义aop,这个例子只是演示声明,并无实际意义,具体如下:

 

@Aspect

public class AopTest {

    

     @Before("execution(** com.aop.utils.test1(..))")

     public void test1() {

          // TODO

     }

    

     @AfterReturning("execution(**com.aop.utils.test2(..))")

     public void test2() {

          // TODO

     }

    

     @AfterThrowing("execution(**com.aop.utils.test3(..))")

     public void test3() {

          // TODO

     }

    

}

 

 

 

 

 

 

好了,本篇就介绍这里,后续文章将继续总结Spring的AOP实现及各个细节的详细实现。由于作者水平有限,请在评论或(QQ: 245389109)不吝赐教,谢谢。

 

 

 

 

 

 

1 0
原创粉丝点击