Spring AOP

1.知识背景

软件系统可以看成是由一组关注点组成的,其中,直接的业务关注点,是直切关注点。而为直切关注点提供服务的,就是横切关注点。

2.面向切面的基本原理

什么是面向切面编程

  横切关注点:影响应用多处的功能(安全、事务、日志)

切面:

  横切关注点被模块化为特殊的类,这些类称为切面

优点:

  每个关注点现在都集中于一处,而不是分散到多处代码中服务模块更简洁,服务模块只需关注核心代码。

AOP 术语

通知:
  定义:切面也需要完成工作。在 AOP 术语中,切面的工作被称为通知。 工作内容:通知定义了切面是什么以及何时使用。除了描述切面要完成的工作,通知还解决何时执行这个工作。 Spring 切面可应用的 5 种通知类型:

  Before——在方法调用之前调用通知 After——在方法完成之后调用通知,无论方法执行成功与否 After-returning——在方法执行成功之后调用通知

  After-throwing——在方法抛出异常后进行通知 Around——通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为

连接点:
  定义:连接点是一个应用执行过程中能够插入一个切面的点。 连接点可以是调用方法时、抛出异常时、甚至修改字段时、 切面代码可以利用这些点插入到应用的正规流程中 程序执行过程中能够应用通知的所有点。

切点:
  定义:如果通知定义了“什么”和“何时”。那么切点就定义了“何处”。切点会匹配通知所要织入的一个或者多个连接点。 通常使用明确的类或者方法来指定这些切点。 作用:定义通知被应用的位置(在哪些连接点)

切面:
  定义:切面是通知和切点的集合,通知和切点共同定义了切面的全部功能——它是什么,在何时何处完成其功能。

引入:
  引入允许我们向现有的类中添加方法或属性

织入:
  织入是将切面应用到目标对象来创建的代理对象过程。 切面在指定的连接点被织入到目标对象中,在目标对象的生命周期中有多个点可以织入

  编译期——切面在目标类编译时期被织入,这种方式需要特殊编译器。AspectJ的织入编译器就是以这种方式织入切面。

  类加载期——切面在类加载到 JVM ,这种方式需要特殊的类加载器,他可以在目标类被引入应用之前增强该目标类的字节码。AspectJ5 的 LTW 就支持这种织入方式

  运行期——切面在应用运行期间的某个时刻被织入。一般情况下,在织入切面时候,AOP 容器会为目标对象动态的创建代理对象。Spring AOP 就是以这种方式织入切面。

3.Spring 对 AOP 的支持

  并不是所有的 AOP 框架都是一样的,他们在连接点模型上可能有强弱之分。
  有些允许对字段修饰符级别应用通知 有些支持方法调用连接点 Spring 提供的 4 种各具特色的 AOP 支持

  基于代理的经典 AOP; @AspectJ 注解驱动的切面; 纯 POJO 切面; 注入式 AspectJ 切面; Spring

  在运行期间通知对象通过在代理类中织入包裹切面,Spring 在运行期间将切面织入到 Spring 管理的 Bean 中。
  代理类封装了目标类,并拦截被通知的方法调用,再将调用转发给真正的目标 Bean

  当拦截到方法调用时,在调用目标 Bean 方法之前,代理会执行切面逻辑。
  当真正应用需要被代理的 Bean 时,Spring 才创建代理对象。如果使用 ApplicationContext,在 ApplicationContext 从 BeanFactory 中加载所有 Bean 时,Spring 创建代理对象,因为 Spring 在运行时候创建代理对象,所以我们不需要特殊的编译器来织入 Spring AOP 的切面。 Spring 支持方法创建连接点
  因为 Spring 基于动态代理,所以 Spring 只支持方法连接点。 Spring 缺失对字段连接点的支持,无法让我们更加细粒度的通知,例如拦截对象字段的修改 Spring 缺失对构造器连接点支持,我发在 Bean 创建时候进行通知。

4.使用切点选择连接点

切点用于准确定位,确定在什么地方应用切面通知。 Spring 定义切点
在 Spring AOP 中,需要使用 AspectJ 的切点表达式来定义切点。

AspectJ 指示器 描述
arg () 限制连接点的指定参数为指定类型的执行方法
@args () 限制连接点匹配参数由指定注解标注的执行方法
execution () 用于匹配连接点的执行方法
this () 限制连接点匹配 AOP 代理的 Bean 引用为指定类型的类
target () 限制连接点匹配特定的执行对象,这些对象对应的类要具备指定类型注解
within() 限制连接点匹配指定类型
@within() 限制连接点匹配指定注释所标注的类型(当使用 Spring AOP 时,方法定义在由指定的注解所标注的类里)
@annotation 限制匹配带有指定注释的连接点

1. 创建自己的切点
vcrH0tQgKiC6xb+qzbejrLHqyrbBy87Sw8eyu7nY0MS1xLe9t6i3tbvY1rW1xMDg0M2hozxiciAvPg0KKiC6887Sw8fWuLaowcvIqM/etqjA4MP7us23vbeow/uhozxiciAvPg0KttTT2re9t6i1xLLOyv3B0LHto6zKudPDo6guLqOpserKtsfQtePRodTxyM7S4rXEIHBsYXkoICkgt723qKOszt7C28jrss7Kx8qyw7ShozxiciAvPg0KLSC82cnoztLDx9Do0qrGpcXkx9C14732xqXF5CBjb20uU3ByaW5naW5hY3Rpb24uc3ByaW5naWRvbCCw/KGjv8nS1Mq508Mgd2l0aGluo6ijqTxiciAvPg0KPGltZyBhbHQ9"这里写图片描述" src="/uploadfile/Collfiles/20160506/201605060931001058.png" title="\" />
注意 && 是将 execution( ) 和 within( ) 连接起来,形成的 and 关系。同理也可以使用 "| 或关系、!非关系
- 创建 Spring 的 bean( ) 指示器
Spring 2.5 引入一个新的 bean( ) 指示器,该指示器允许我们在切点表达式中使用 Bean ID 来标识 Bean
bean( ) 使用 Bean ID 或 Bean 名称作为参数来限制切点只匹配特定 Bean。
如下,我们希望执行 Instrument 的 play( ) 方法时候应用通知,但限定 Bean 的 ID 为 eddie

还可以使用非操作作为除了指定 ID 的 Bean 以外的其他 Bean应用通知

在此场景下,切面会通知被编织到所有 ID 不为 eddie 的 Bean 中

5.在 XML 中声明切面

Spring 的 AOP 配置元素简化了基于 POJO 切面声明

AOP 配置元素 描述
aop : advisor 定义 AOP 通知器
aop : after 定义 AOP 后置通知(不管被通知方法是否执行成功)
aop : after-returing 定义 AOP after-returing 通知
aop : after-throwing 定义 AOP after-throwing 通知
aop : around 定义 AOP 环绕通知
aop : aspect 定义切面
aop : aspectj-autoproxy 启动 @AspectJ 注解驱动的切面
aop : before 定义 AOP 前置通知
aop : config 顶层的 AOP 配置元素,大多数 aop : * 元素必须包含在 元素内
aop : declare-parents 为被通知的对象引入额外接口,并透明的实现
aop : pointcut 定义切点

此文感谢:http://www.2cto.com/kf/201605/506004.html

时间: 2024-11-10 07:42:26

Spring AOP的相关文章

Spring框架之Spring AOP

一.基于注解管理的AOP 1.Spring配置文件 <!-- 配置自动扫描包,自动扫描Bean组件,切面类 --> <context:component-scan base-package="com.zhoujian.spring.anno,com.zhoujian.spring.test"> <!-- <context:include-filter type="annotation" expression="org.a

Spring AOP中pointcut expression表达式解析 及匹配多个条件

Pointcut 是指那些方法需要被执行"AOP",是由"Pointcut Expression"来描述的. Pointcut可以有下列方式来定义或者通过&& || 和!的方式进行组合. args() @args() execution() this() target() @target() within() @within() @annotation 其中 execution 是用的最多的,其格式为: execution(modifiers-pat

spring aop 原理

http://blog.csdn.net/moreevan/article/details/11977115 Spring AOP 实现原理 2013-09-24 15:23 79554人阅读 评论(11) 收藏 举报  分类: spring(2)  版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 什么是AOP AOP(Aspect-OrientedProgramming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)

Spring AOP进行日志记录

在java开发中日志的管理有很多种.我一般会使用过滤器,或者是Spring的拦截器进行日志的处理.如果是用过滤器比较简单,只要对所有的.do提交进行拦截,然后获取action的提交路径就可以获取对每个方法的调用.然后进行日志记录.使用过滤器的好处是可以自己选择性的对某一些方法进行过滤,记录日志.但是实现起来有点麻烦. 另外一种就是使用Spring的AOP了.这种方式实现起来非常简单,只要配置一下配置文件就可以了.可是这种方式会拦截下所有的对action的每个操作.使得效率比较低.不过想做详细日志

spring AOP和通知

1.  spring的通知 1.1.  AOP的概念 切面(Aspect):一个关注点的模块化,这个关注点可能会横切多个对象.事务管理是J2EE应用中一个关于横切关注点的很好的例子.在Spring AOP中,切面可以使用基于模式或者基于注解的方式来实现. 连接点(Joinpoint):在程序执行过程中某个特定的点,比如某方法调用的时候或者处理异常的时候.在Spring AOP中,一个连接点总是表示一个方法的执行. 通知(Advice):在切面的某个特定的连接点上执行的动作.其中包括了"aroun

spring aop 整理

aop常见概念 1.切面 事务.日志.安全性框架.权限等都是切面(就是类,事务有事务类,日志有日志类,权限有权限类) 2.通知 切面中的方法就是通知(类中针对目标方法所要插入的方法,即事务类中执行事务的方法,日志类中执行日志操作的方法) 3.目标类 (你想要侵入修改的方法所在的类,诸如我们想在查询存款时加入一些其他操作,存款管理类就是目标类) 4.切入点 只有符合切入点,才能让通知和目标方法结合在一起 (就是你想要加强的方法,就是查看工资的方法showSalary()) 5.织入: 形成代理对象

JavaEE学习之Spring aop

一.基本概念 AOP——Aspect-Oriented Programming,面向切面编程,它是spring框架的一个重要组成部分.一般的业务逻辑都有先后关系,我们可以理解为纵向关系,而AOP关注的是横向关系,每一个关注点可以理解为一个横切面.例如我们的大部分代码都会涉及到日志记录,很多的数据库操作都会涉及到事务的创建和提交.那么从横向关注这些逻辑,他们都一个个的切面. AOP技术的具体实现,可以通过动态代理技术或者是在程序编译期间进行静态的"织入"方式.AOP经常使用的场景包括:日

Spring AOP详解(转载)

此前对于AOP的使用仅限于声明式事务,除此之外在实际开发中也没有遇到过与之相关的问题.最近项目中遇到了以下几点需求,仔细思考之后,觉得采用AOP 来解决.一方面是为了以更加灵活的方式来解决问题,另一方面是借此机会深入学习Spring AOP相关的内容.本文是权当本人的自己AOP学习笔记,以下需求不用AOP肯定也能解决,至于是否牵强附会,仁者见仁智者见智. 对部分函数的调用进行日志记录,用于观察特定问题在运行过程中的函数调用情况 监控部分重要函数,若抛出指定的异常,需要以短信或邮件方式通知相关人员

Spring AOP 之 通知、连接点、切点、切面。

1:知识背景 软件系统可以看成是由一组关注点组成的,其中,直接的业务关注点,是直切关注点.而为直切关注点提供服务的,就是横切关注点. 2:面向切面的基本原理 什么是面向切面编程 横切关注点:影响应用多处的功能(安全.事务.日志) 切面: 横切关注点被模块化为特殊的类,这些类称为切面 优点: 每个关注点现在都集中于一处,而不是分散到多处代码中 服务模块更简洁,服务模块只需关注核心代码. AOP 术语 通知: 定义:切面也需要完成工作.在 AOP 术语中,切面的工作被称为通知. 工作内容:通知定义了

深入理解Spring AOP之基本概念

深入理解Spring AOP之基本概念 AOP到底是什么 Spring AOP和IOC是听到的关于Spring最频繁的两个词了.现在来重点关注AOP这个词,IOC先放一边,下面这段话摘自Spring优势中关于面向切面的介绍: 面向切面--Spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务(transaction)管理)进行内聚性的开发.应用对象只实现它们应该做的--完成业务逻辑--仅此而已.它们并不负责(甚至是意识)其它的系统级关