@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)的更多相关文章

  1. 011-Spring aop 002-核心说明-切点PointCut、通知Advice、切面Advisor

    一.概述 切点Pointcut,切点代表了一个关于目标函数的过滤规则,后续的通知是基于切点来跟目标函数关联起来的. 然后要围绕该切点定义一系列的通知Advice,如@Before.@After.@Af ...

  2. Spring笔记07(Spring AOP的通知advice和顾问advisor)

    1.Spring AOP的通知advice 01.接口代码: package cn.pb.dao; public interface UserDao { //主业务 String add(); //主 ...

  3. 通知advice

    基于注解的Spring AOP开发,来自https://www.cnblogs.com/junzi2099/p/8274813.html 1.定义目标类接口和实现类 2.编写Spring AOP的as ...

  4. 有哪些类型的通知Advice?

    Before - 这些类型的 Advice 在 joinpoint 方法之前执行,并使用 @Before 注解标记进行配置. After Returning - 这些类型的 Advice 在连接点方法 ...

  5. 什么是通知Advice?

    特定 JoinPoint 处的 Aspect 所采取的动作称为 Advice.Spring AOP 使用一个 Advice 作为拦截器,在 JoinPoint "周围"维护一系列的 ...

  6. Spring 通知(Advice)和顾问(Advisor)

    AOP ( Aspect  Oriented Programming  面向切面编程)  在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译 ...

  7. Spring中的通知(Advice)和顾问(Advisor)

    在Spring中,目前我学习了几种增强的方式,和大家分享一下 之前的话: 1.AOP  (Aspect  Oriented Programming  面向切面编程) 在软件业,AOP为Aspect O ...

  8. Spring学习(十五)----- Spring AOP通知实例 – Advice

    Spring AOP(面向方面编程)框架,用于在模块化方面的横切关注点.简单得说,它只是一个拦截器拦截一些过程,例如,当一个方法执行,Spring AOP 可以劫持一个执行的方法,在方法执行之前或之后 ...

  9. Spring AOP通知实例 – Advice

    Spring AOP(面向方面编程)框架,用于在模块化方面的横切关注点.简单得说,它只是一个拦截器拦截一些过程,例如,当一个方法执行,Spring AOP 可以劫持一个执行的方法,在方法执行之前或之后 ...

随机推荐

  1. python中如何对list之间求交集,并集和差集

    最近遇到一个从list a里面去除list b的元素的问题,由于a很大,b也不小.所以遇到点困难,现在mark一下. 先说最简单的方法: a = [1, 2, 3, 4, 5, 6, 7, 8, 9, ...

  2. 【js】右下角浮动窗口

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. Python学习笔记011——内置函数exec()

    1 描述 把一个字符串当成语句执行 exec()  执行储存在字符串或文件中的 Python 语句,相比于  eval() , exec() 可以执行更复杂的 Python 代码. exec函数和ev ...

  4. 转 selenium 自动下载文件

    #coding=utf-8from selenium import webdriver #实例化一个火狐配置文件fp = webdriver.FirefoxProfile() #设置各项参数,参数可以 ...

  5. RAC安装重新运行root.sh

    rac1执行root.sh成功,rac2执行失败. 在重新执行root.sh前,在rac2上把crs等配置信息删除: # /u01/app//grid/crs/install/rootcrs.pl - ...

  6. codeforces#254DIV2解题报告

    今天简直大爆发啊... 吃了顿烧烤竟然这么管事. . . .. 本弱渣竟然做出来了3道,并且B题是我第一次在CF中用到算法..(曾经最多也就是贪心. . . ). 题目地址:codeforces#22 ...

  7. [转]Win7独立语言包下载

    想找个语言包太不容易了 ,全是旧版的,最后不得以...在国外网站找到了下载地址,全部是最新的语言包!自己找对应语言的缩写吧 64-bit (x64) Windows 7 SP1: http://dow ...

  8. activiti表

    act_re_deployment #部署对象表 act_re_prodef  #流程定义表 act_ge_bytearray #资源文件表 act_ge_property   #主键生成策略表 ac ...

  9. Linux下hosts、host.conf、resolv.conf的区别

    /etc/resolv.conf 该文件是DNS域名解析的配置文件,它的格式很简单,每行以一个关键字开头,后接配置参数.resolv.conf的关键字主要有四个,分别是:nameserver   #定 ...

  10. 了不起的 “filter(NULL IS NOT NULL)”

    经常会在执行计划中看到很奇怪的"FILTER"操作,然后看对应的执行信息是"filter(NULL IS NOT NULL)".  其实这是优化器非常聪明的“短 ...