SpringAOP 通知(advice)
@Aspect
@Order(1)
public class AopOne { /**
* 目标方法执行之前
* @param joinPoint
*/
@Before("execution(* com.gary.operation.*.*(..))")
public void befor(JoinPoint joinPoint) {
MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
System.out.println("AopOne.befor()");
} /**
* 目标方法执行以后 无论是否出现异常 相当于finally语句块
* 该方法优先于@AfterReturning
* @param joinPoint
*/
@After("execution(* com.gary.operation.*.*(..))")
public void after(JoinPoint joinPoint) {
System.out.println("AopOne.after()");
} /**
* 方法返回以后 没有出现异常的情况
*/
@AfterReturning(pointcut="execution(* com.gary.operation.*.*(..))", returning="returnVal")
public void afterReturning(JoinPoint joinPoint,Student returnVal) {
System.out.println("AopOne.afterReturning()" + returnVal.getName());
} /**
* 方法抛出异常时执行
* @param joinPoint
*/
@AfterThrowing(pointcut="execution(* com.gary.operation.*.*(..))", throwing="throwable")
public void afterThrowing(JoinPoint joinPoint, Throwable throwable) {
System.out.println("AopOne.afterThrowing()" + throwable.getMessage());
} /**
* 环绕执行 可以自由控制目标方法
* @param proceedingJoinPoint
* @return
*/
//@Around("execution(* com.gary.operation.*.*(..))")
public Object around(ProceedingJoinPoint proceedingJoinPoint) {
Object result = null;
try {
System.out.println("AopOne.around()-begin");
result = proceedingJoinPoint.proceed();
System.out.println("AopOne.around()-end");
} catch (Throwable e) {
e.printStackTrace();
}
return result;
} }
1、概念术语
在开始之前,需要理解Spring aop 的一些基本的概念术语(总结的个人理解,并非Spring官方定义):
切面(aspect):用来切插业务方法的类。
连接点(joinpoint):是切面类和业务类的连接点,其实就是封装了业务方法的一些基本属性,作为通知的参数来解析。
通知(advice):在切面类中,声明对业务方法做额外处理的方法。
切入点(pointcut):业务类中指定的方法,作为切面切入的点。其实就是指定某个方法作为切面切的地方。
目标对象(target object):被代理对象。
AOP代理(aop proxy):代理对象。
通知:
前置通知(before advice):在切入点之前执行。
后置通知(after advice): 相当于finally语句块,无论是否出现异常都执行
后置通知(after returning advice):在切入点执行完成后,执行通知。(出现异常不执行)
环绕通知(around advice):包围切入点,调用方法前后完成自定义行为。
异常通知(after throwing advice):在切入点抛出异常后,执行通知。
2、常用表达式总结
1、任何一个目标对象声明的类型有一个 @Transactional 注解的连接点
@Pointcut("@within(org.springframework.transaction.annotation.Transactional)")
2、任何一个执行的方法有一个 @Transactional 注解的连接点
@Pointcut("@annotation(org.springframework.transaction.annotation.Transactional)")
3、任何一个只接受一个参数,并且运行时所传入的参数是java.lang.String接口的连接点
@Pointcut("args(java.lang.String)")
4、任何一个在名为'tradeService'的Spring bean之上的连接点
@Pointcut("bean(UserDao)")
任何一个在名字匹配通配符表达式'*Service'的Spring bean之上的连接点
@Pointcut("bean(*Dao)")
5、组合使用 && 并且的意思。 即俩个条件都需要满足。
@Before("aPointcut() && args(java.lang.String)")
6、组合使用并且接收参数
@Before("aPointcut() && args(s)")
public void beforeAdvice(String s) {
System.out.println("before advice is executed!" + s);
}
7、组合使用接收参数和注解
@Before("aPointcut() && args(s) && @annotation(tx)")
public void beforeAdvice(String s, Transactional tx) {
System.out.println("before advice is executed!" + tx);
}
8、组合使用接收注解
@Before(value="execution(* com.gary.operation.demo.proxy.*.*(..)) && @annotation(tx)")
public void beforeAdvice(Transactional tx) {
System.out.println("before advice is executed!" + tx);
}
SpringAOP 通知(advice)的更多相关文章
- 011-Spring aop 002-核心说明-切点PointCut、通知Advice、切面Advisor
一.概述 切点Pointcut,切点代表了一个关于目标函数的过滤规则,后续的通知是基于切点来跟目标函数关联起来的. 然后要围绕该切点定义一系列的通知Advice,如@Before.@After.@Af ...
- Spring笔记07(Spring AOP的通知advice和顾问advisor)
1.Spring AOP的通知advice 01.接口代码: package cn.pb.dao; public interface UserDao { //主业务 String add(); //主 ...
- 通知advice
基于注解的Spring AOP开发,来自https://www.cnblogs.com/junzi2099/p/8274813.html 1.定义目标类接口和实现类 2.编写Spring AOP的as ...
- 有哪些类型的通知Advice?
Before - 这些类型的 Advice 在 joinpoint 方法之前执行,并使用 @Before 注解标记进行配置. After Returning - 这些类型的 Advice 在连接点方法 ...
- 什么是通知Advice?
特定 JoinPoint 处的 Aspect 所采取的动作称为 Advice.Spring AOP 使用一个 Advice 作为拦截器,在 JoinPoint "周围"维护一系列的 ...
- Spring 通知(Advice)和顾问(Advisor)
AOP ( Aspect Oriented Programming 面向切面编程) 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译 ...
- Spring中的通知(Advice)和顾问(Advisor)
在Spring中,目前我学习了几种增强的方式,和大家分享一下 之前的话: 1.AOP (Aspect Oriented Programming 面向切面编程) 在软件业,AOP为Aspect O ...
- Spring学习(十五)----- Spring AOP通知实例 – Advice
Spring AOP(面向方面编程)框架,用于在模块化方面的横切关注点.简单得说,它只是一个拦截器拦截一些过程,例如,当一个方法执行,Spring AOP 可以劫持一个执行的方法,在方法执行之前或之后 ...
- Spring AOP通知实例 – Advice
Spring AOP(面向方面编程)框架,用于在模块化方面的横切关注点.简单得说,它只是一个拦截器拦截一些过程,例如,当一个方法执行,Spring AOP 可以劫持一个执行的方法,在方法执行之前或之后 ...
随机推荐
- nginx反向代理proxy_set_header自定义header头无效
公司使用nginx作为负载均衡,有时候需要自定义header头发送给后端的真实服务器. 想过去应该是非常的简单的事情. 例子如下: 设置代理服务器ip头 1 proxy_set_header X- ...
- POJ 3691 DNA repair (DP+AC自动机)
DNA repair Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 4815 Accepted: 2237 Descri ...
- Linux GPIO子系统
一 概述 Linux内核中gpio是最简单,最常用的资源(和 interrupt ,dma,timer一样)驱动程序,应用程序都能够通过相应的接口使用gpio,gpio使用0-MAX_INT之间的整数 ...
- oc 目录结构
最顶级的oc2是一个项目名,下级的oc2下面的文件是一些程序文件(.m或者.h的文件)和一些界面文件(.xib或者storyboard文件),supporting files文件下面的是资源文件,可以 ...
- A class file was not written. The project may be inconsistent, if so try refreshing this project and building it. eclipse提示错误
感觉很奇怪,查看了一下磁盘,发现workspace所在磁盘已经满了,删除一些文件之后,选择项目->Project->Clean...->选择Clean all projects-&g ...
- Concurrency Managed Workqueue(一)workqueue基本概念
一.前言 workqueue是一个驱动工程师常用的工具,在旧的内核中(指2.6.36之前的内核版本)workqueue代码比较简单(大概800行),在2.6.36内核版本中引入了CMWQ(Concur ...
- UHF RFID编码之TPP编码
GB/T 39768通信交互模型 读写器使用TPP对基带数据进行编码,使用DSB-ASK或者SSB-ASK方式调制射频载波,向一个或者多个标签发送命令.命令发送后,读写器继续发送未经调制的射频载波,并 ...
- web项目,美工和前台配合,页面路径访问问题
一.美工写页面使用相对路径,但后台使用项目的应用绝对路径,访问时会出现404或页面乱码的问题 目前的解决方法:在页面中添加base标签,指定当前页面默认的路径 base标签:为页面上的所有链接规定默认 ...
- asp.net2.0导出pdf文件完美解决方案【转载】
asp.net2.0导出pdf文件完美解决方案 作者:清清月儿 PDF简介:PDF(Portable Document Format)文件格式是Adobe公司开发的电子文件格式.这种文件格式与操作系统 ...
- PHPEXCEL导出excel表格中长数字文本自动转为科学计数法的解决办法
方法一:前面加空格 $objActSheet->setCellValue('A1', ' '.'330602198804224688'); 方法二: $objActSheet->setCe ...