Advice详解

1.前置增强

BeforeAdvice是前置增强的接口,方法前置增强的MethodBeforeAdvice接口是其子类,

MethodBeforeAdvice接口仅仅定义了唯一的方法:before(Method method,Object[] args,Object obj) throws Throwable,

method为目标类的方法;args为目标类方法的入参;而obj为目标类实例。

当该方法发生异常时,将阻止目标类方法的执行

2.后置增强

后置增强在目标类方法调用后执行

通过实现AfterReturningAdvice来定义后置增强的逻辑,仅仅定义了唯一的方法

afterReturning(Object returnObj,Method method,Object[] args,Object obj) Throws Throwable

returnObj为目标实例方法返回的结果;method为目标类的方法;args为目标实例的方法的入参;而obj为目标类实例

注:假设在后置增强中抛出异常,如果该异常的目标方法声明的异常,则该异常归并到目标方法中

如果不是目标方法所声明的异常,则Spring将其转为运行期异常抛出

3.环绕增强

环绕增强允许在目标类方法调用前后织入横切逻辑,综合实现了前置、后置增强两者的功能

Spring直接使用AOP联盟所定义的import org.aopalliance.intercept.MethodInterceptor作为环绕增强的接口。

该接口有唯一的接口方法Object invoke(MethodInvocation invocation) throws Throwable

MethodInvocattion不但封装目标方法及其入参数组,还封装了目标方法所在的实例对象,

通过MethodInvocation的getArguments()可以获取目标方法的入参数组,

通过procced()反射调用目标实例相应的方法

4.异常抛出增强

异常抛出增强最适合的应用场景的是事务管理,当参与事务的某个Dao发生异常时,事务管理器就必须回滚事务

ThrowsAdvice异常抛出增强接口没有定义任何方法,它是一个标识接口,在运行期Spring使用反射的机制自行判断,

我们必须采用以下签名形式定义异常抛出的增强方法:

void afterThrowing(Method method,Object[] args,Object target,Throwable th)

方法名必须为afterThrowing,方法入参规定如下:前三个入参时可选的(要么三个入参提供,要么不提供)

最后一个入参是Throwable或其子类

可以在同一个异常抛出增强中定义多个afterThrowing(),当目标类方法抛出异常时,

Spring会自动选用最匹配的增强方法

5.引介增强

引介增强是一种比较特殊的增强类型,它不是在目标方法周围织入增强,而是为目标类创建新的方法和属性

所以引介增强的连接点是类级别的,而非方法级别的。

通过引介增强,我们可以为目标类添加一个接口的实现,即原来目标类为实现某个接口,

通过引介增强可以为目标类创建实现某接口的代理

Spring定义了引介增强接口IntroductionInterceptor,该接口没有定义任何方法,

Spring为该接口提供了DelegatingIntroductionInterceptor实现类,

一般情况下,我们通过扩展该实现类定义自己的引介增强类

来自为知笔记(Wiz)

时间: 2024-10-10 16:41:36

Advice详解的相关文章

Spring事务管理(详解+实例)

写这篇博客之前我首先读了<Spring in action>,之后在网上看了一些关于Spring事务管理的文章,感觉都没有讲全,这里就将书上的和网上关于事务的知识总结一下,参考的文章如下: Spring事务机制详解 Spring事务配置的五种方式 Spring中的事务管理实例详解 1 初步理解 理解事务之前,先讲一个你日常生活中最常干的事:取钱. 比如你去ATM机取1000块钱,大体有两个步骤:首先输入密码金额,银行卡扣掉1000元钱:然后ATM出1000元钱.这两个步骤必须是要么都执行要么都

Spring AOP详解(转载)

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

css文本格式详解

一.css文本主体内容: 二.css文本详解:  1.文本缩进 语法: text-indent:<length>|<percentage> 默认值为0. 属性值详解: <length>:用长度值指定文本的缩进.可以为负值.   <percentage>:用百分比指定文本的缩进.可以为负值. <inherit>:继承父级text-indent属性值. 用法: 检索或设置对象中的文本的缩进. 内联对象要使用该属性必须先使该对象表现为块级或内联块级.

spring声明式事务配置详解

spring声明式事务配置详解 君子不器 2013年06月16日 编程世界 5273次阅读 查看评论 理解Spring的声明式事务管理实现 本节的目的是消除与使用声明式事务管理有关的神秘性.简单点儿总是好的,这份参考文档只是告诉你给你的类加上@Transactional注解,在配置文件中添加('<tx:annotation-driven/>')行,然后期望你理解整个过程是怎么工作的.此节讲述Spring的声明式事务管理内部的工作机制,以帮助你在面对事务相关的问题时不至于误入迷途,回朔到上游平静

oracle体系结构详解

Oracle体系结构就是围绕这张图展开的,要想深入了解oracle,就必须把这张图搞明白. 如图: 一.基本组成: Oracle server: 一般情况下是一个instance和一个database组成 1个instance只能对应一个数据库.    特殊:1个数据库可以有多个instance(rac) 一台服务器上同时可装多套版本的数据库软件,每个数据库软件可建多个数据库,但是每个数据库只对应一个instance,也可以理解成每个数据库只有一个SID . 利用DBCA建出的每个库都是相对独立

一份spring配置文件及其详解

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/axu20/archive/2009/10/14/4668188.aspx 1.基本配置:<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/

Spring AOP四种实现方式Demo详解与相关知识探究

一.前言 在网络上看到一篇博客Spring实现AOP的4种方式,博主写的很通俗易懂,但排版实在抓狂,对于我这么一个对排版.代码格式有强迫症的人来说,实在是不能忍受~~~~(>_<)~~~~. 我亲手实现了一遍,重新整理,加上了一些不易关注到的细节.漏掉的知识,以及自己对AOP的一些理解,写成这篇博客. 二.AOP相关概念 (1)AOP是什么?AOP与拦截器的区别? 太抽象的不说,如果你知道Struts2的拦截器,拦截器就是应用的AOP的思想,它用于拦截Action以进行一些预处理或结果处理.而

Spring的AOP详解

Spring的AOP详解 一.AOP基础 1.1AOP是什么 考虑这样一个问题:需要对系统中的某些业务做日志记录,比如支付系统中的支付业务需要记录支付相关日志,对于支付系统可能相当复杂,比如可能有自己的支付系统,也可能引入第三方支付平台,面对这样的支付系统该如何解决呢? 传统解决方案 1.日志部分定义公共类LogUtils,定义logPayBegin方法用于记录支付开始日志, logPayEnd用于记录支付结果 logPayBegin(long userId,long money) logPay

spring AOP详解〇

AOP正在成为软件开发的下一个圣杯.使用AOP,你可以将处理aspect的代码注入主程序,通常主程序的主要目的并不在于处理这些aspect.AOP可以防止代码混乱. 为了理解AOP如何做到这点,考虑一下记日志的工作.日志本身不太可能是你开发的主程序的主要任务.如果能将"不可见的".通用的日志代码注入主程序中,那该多好啊.AOP可以帮助你做到. Spring framework是很有前途的AOP技术.作为一种非侵略性的,轻型的AOP framework,你无需使用预编译器或其他的元标签,