Spring AOP增强(Advice)
Sring AOP通过PointCut来指定在那些类的那些方法上织入横切逻辑,通过Advice来指定在切点上具体做什么事情。如方法前做什么,方法后做什么,抛出异常做什么。

Spring中有两种方式定义Pointcut:
·XML文件
·注解
XML与注解方式类似,学会了一种,另外一种无难度上手。
Advice接口的接口继承类:
主要可分为5类增强:
·MthodBeforeAdvice:目标方法实施前增强
·AfterReturningAdvice:目标方法实施后增强
·ThrowsAdvice 异常抛出增强
·IntroductionAdvice 引介增强,为目标类添加新的属性和方法。可以构建组合对象来实现多继承
·MethodInterceptor 方法拦截器,环绕增强,在方法的前后实施操作
AfterAdvice,BeforeAdvice当前是作为标记使用,内部无接口方法,为后来扩展使用。
Interceptor接口也不是直接使用,同样作为标记类,可使用其子接口。
前置增强主要在匹配到的切点运行之前执行,在XML配置中使用,相应的接口为MethodBeforeAdvice,其方法为
当一个Bean对象实现了MethodBeforeAdvice,在XML配置文件中指定这个bean为advice,Spring会自动在切点方法执行前执行MethodBeforeAdvice的接口。
在调用相应的切点方法之前,前置增强都会生效。
弄明白了前置增强,后置增强也是同一个道理,不过后置增强是在切点运行后执行。接口为AfterReturningAdvice,方法为
在切点方法运行之后,后置增强会生效。
当切点方法抛出异常时,异常抛出增强才会被执行。其接口为ThrowsAdvice,接口没有指定方法,实现这个接口的对象是通过反射来调用其增强方法的。
根据前面的前置,后置,异常抛出增强,看一个完整的案例:
通过上面这个案例,我们大体知道什么是增强,字面意思:
在原本方法之上增加一些额外的东西,原本的功能增强了,所以叫增强,这是中文翻译过来的增强。
英文名为Advice,建议,在方法周围建议方法做什么事情,然后真的做了...
环绕增强可以理解为前置增强,后置增强,异常抛出增强的结合体,只有一个接口MethodInterceptor,其方法为:
Object intercept(Object var1, Method var2, Object[] var3, MethodProxy var4) throws Throwable;
当多个增强作用与同一个切点的时候,具体哪一个增强会先执行呢?
Spring根据@Order注解或者实现了Ordered接口的增强类来进行判断。
增强的概念一样,在使用方式上稍微有点区别,增强的相关注解有:
@Before
@AfterReturning
@AfterThrowing(
@After //相当于try-catch-finally中的final,一般用于释放资源
@Around
使用上与接口差不多
增强是AOP中核心概念之一,今后会继续探讨。
2019年8月8日更新:
博主近日在项目中需要配置多数据源,并且要实现带事务的动态切换,于是上网查找办法,最后采用的spring多数据源配置实现带事务的动态切换,但是在该过程中遇到了一个问题,就是数据源动态切换到非默认数据源时,一旦目标方法抛出异常会导致数据源切换失败,翻阅了spring的AOP增强后,发现可以解决这个问题,具体的实现参看博主的博文:https://www.cnblogs.com/nietzsche2019/p/11305654.html
下面是在实现ThrowsAdvice接口时遇到问题,记录下来希望能帮到大家:
在实现ThrowsAdvice接口时,发现不会自动重写方法,但是运行时会出现异常,无奈上网查资料发现该接口中没有任何抽象方法,查找了相关资料发现,Spirng内部是用反射来实现方法匹配的,需要实现下列接口中的其中1个:
public void afterThrowing(Exception e);
public void afterThrowing(RemoteException re);
public void afterThrowing(Metho method, Object[] args, Object target, Exception e);
public void afterThrowing(Metho method, Object[] args, Object target, ServletException e);
Spirng设计者可能感觉如果全部声明成抽象方法的话,实现该接口就必须全部重写,代码冗余较高,所以干脆直接做成标识接口了。
Spring AOP增强(Advice)的更多相关文章
- Spring AOP Example – Advice
Spring AOP + AspectJ Using AspectJ is more flexible and powerful. Spring AOP (Aspect-oriented progra ...
- Spring AOP 中 advice 的四种类型 before after throwing advice around
spring AOP(Aspect-oriented programming) 是用于切面编程,简单的来说:AOP相当于一个拦截器,去拦截一些处理,例如:当一个方法执行的时候,Spring 能够拦截 ...
- 基于XML配置的spring aop增强配置和使用
在我的另一篇文章中(http://www.cnblogs.com/anivia/p/5687346.html),通过一个例子介绍了基于注解配置spring增强的方式,那么这篇文章,只是简单的说明,如何 ...
- Spring Aop——给Advice传递参数
给Advice传递参数 Advice除了可以接收JoinPoint(非Around Advice)或ProceedingJoinPoint(Around Advice)参数外,还可以直接接收与切入点方 ...
- Spring AOP 创建Advice 定义pointcut、advisor
前面定义的advice都是直接植入到代理接口的执行之前和之后,或者在异常发生时,事实上,还可以对植入的时机定义的更细. Pointcut定义了advice的应用时机,在Spring中pointcutA ...
- Spring AOP 创建Advice 基于Annotation
public interface IHello { public void sayHello(String str); } public class Hello implements IHello { ...
- Spring AOP高级——源码实现(3)AopProxy代理对象之JDK动态代理的创建过程
spring-aop-4.3.7.RELEASE 在<Spring AOP高级——源码实现(1)动态代理技术>中介绍了两种动态代理技术,当然在Spring AOP中代理对象的生成也是运用 ...
- spring---aop(10)---Spring AOP中AspectJ
写在前面 在之前的文章中有写到,Spring在配置中,会存在大量的切面配置.然而在很多情况下,SpringAOP 所提供的切面类真的不是很够用,比如想拦截制定的注解方法,我们就必须扩展DefalutP ...
- 《Spring 5官方文档》 Spring AOP的经典用法
原文链接 在本附录中,我们会讨论一些初级的Spring AOP接口,以及在Spring 1.2应用中所使用的AOP支持. 对于新的应用,我们推荐使用 Spring AOP 2.0来支持,在AOP章节有 ...
随机推荐
- window, linux, mac 比较文件和文件夹的区别
windows 端 winmerge beyondcompare Mac 和 linux 端 Meld kdiff3 diff command 更多可参考:https://alternativeto ...
- 基于MQTT的串口数据转发器
问: ComHub能做什么?ComHub使用MQTT协议,将串口数据经TCP分发出去.这种结构可以实现很多功能:1.COM-Over-TCP: 将COM数据使用TCP远程传送;2.COM多播:一个CO ...
- SpringBoot-核心依赖说明
spring-boot-dependencies 一般用来放在父项目中,来声明依赖,子项目引入相关依赖而不需要指定版本号,好处就是解决依赖冲突,统一管理依赖版本号 利用pom的继承,一处声明,处处使用 ...
- Android基础相关面试问题-binder面试问题详解
Linux内核的基础知识: 进程隔离/虚拟地址空间:在操作系统中为了保护某个进程互不干扰就设计了一个叫“进程隔离”的技术,防止进程A可以操作进程B的数据.而进程隔离技术用到了虚拟地址空间,进程A的虚拟 ...
- 第八章 watch监听 86 watch、computed、methods的对比
- 第二章 Vue快速入门--7 讲解v-cloak、v-text、v-html的基本使用
7 讲解v-cloak.v-text.v-html的基本使用 <!DOCTYPE html> <html lang="en"> <head> & ...
- MyBatis-01-简介
基础知识: JDBC Mysql Java基础 Maven Junit 框架:是有配置文件的.最好的方式:看官网文档 1.简介 1.1.什么是MyBatis 简介 什么是 MyBatis? MyBat ...
- 移动端H5不常见兼容收集
1.微信分身input不支持上传,无法监听到上传事件 解决方案:判断在微信浏览器端使用微信JSSDK上传
- 网络摘抄-深入浅出JVM调优
基本概念: JVM把内存区分为堆区(heap).栈区(stack)和方法区(method).由于本文主要讲解JVM调优,因此我们可以简单的理解为,JVM中的堆区中存放的是实际的对象,是需要被GC的.其 ...
- Logitech G系鼠标脚本编程,实现鼠标自动定位控制
利用罗技官方提供的API来写一个鼠标自动定位移动脚本 点击脚本编辑器中的帮助选项,查看罗技官方提供的API说明,有很多实现好的鼠标功能 G-series Lua API V8.45 Overview ...