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)不吝赐教,谢谢。
- Spring框架总结之面向切面(一)
- SSM框架 之 Spring-AOP(面向切面编程)
- SSM框架 之 Spring-AOP(面向切面编程)
- Spring框架之AOP面向切面编程
- spring框架学习之路(一)-入门基础(2)-动态代理和AOP(面向切面编程)
- Spring AOP 面向切面编程(一)
- Spring之AOP(面向切面编程)
- Spring之AOP(面向切面编程)
- 大数据WEB阶段Spring框架 AOP面向切面编程(一)
- 面向切面的Spring<一>
- Spring面向切面编程一
- Spring之AOP面向切面编程实现(一)
- spring之Aop面向切面
- 【spring框架】(三)面向切面编程(AOP)
- Spring框架(二)--AOP面向切面编程
- Spring实战笔记——面向切面编程(一)
- Spring核心AOP(面向切面编程)总结
- Spring入门之面向切面的Spring
- [BZOJ3697][[FJ2014集训]采药人的路径][点分治]
- css vertical-align属性
- c++访问webservice(gsoap简单使用)
- PAT 1100
- Application Installation Failed 解决办法
- Spring框架总结之面向切面(一)
- MySQL数据库yyyy-MM-dd HH:mm:ss格式查询最近一周内每天的记录
- gitblit.cmd运行自动关闭
- Spring面向切面编程
- Hibernate注解方式处理实体映射关系
- ASP.NET ZERO 学习 —— (6) 开发手册之MVC后台多页面应用及迁移控制台程序
- 什么是关系型数据库??
- leetcode21~Merge Two Sorted Lists
- MyBatis的联合查询