SpringAOP的通知分为以下五种:

1前置通知(@before)
在连接点执行之前执行的代码

2后置通知(@after)
在连接点执行之后执行的代码,不管连接点执行后是否出现异常,后置通知都会执行,但是不能访问连接点返回值

3返回通知
返回通知:就是可以获取连接点的返回值,
      当连接点执行之后,若没有异常,则执行返回通知,返回通知在后置通知执行后才会执行

4异常通知
在连接点执行的时候,若出现异常,则会执行异常通知,可以根据异常类型来定义执行对应的异常通知

5环绕通知
相当于一个动态代理,也就是说其动能包括了前面四个通知的功能,

示例代码:

package com.jeremy.aop.example;import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
/** 使用AOP的步骤* 1声明一个切面,切面必须是在IOC容器中,所以必须添加@component注解,而且还说明是一个切面,所以还要添加@Aspect注解* 2定义通知:通知有五种,分别是前置通知、后置通知、返回通知、异常通知、环绕通知,根据业务需求定义所需的通知* 3在通知里说明通知时由那个类的那个方法执行* 4在Spring的配置文件自动扫描<context:component-scan>和配置AspectJ* 配置AspectJ是当我们调用一个目标方法时,而这个目标方法跟我注解声明的方法相匹配的时候,那么AOP框架应该自动的为那个方法所在的那个类生成一个代理对象,* 在我目标方法执行之前先来执行切面的对应的方法*/@Aspect
@Component
public class LoggingAspect {@Before("execution(* com.jeremy.aop.example.ArithmeticCalculator.*(..))")private void beforeMethod() {System.out.println("the Method begins........");}@After("execution(* com.jeremy.aop.example.ArithmeticCalculator.*(..))")private void afterMethod() {// TODO Auto-generated method stubSystem.out.println("The Method after ................");}@AfterReturning(value="execution(* com.jeremy.aop.example.ArithmeticCalculator.*(..))",returning="result")public void AfterReturning(JoinPoint joinPoint,Object result){System.out.println("The Method after ................"+result);}@AfterThrowing(value="execution(* com.jeremy.aop.example.ArithmeticCalculator.*(..))",throwing="e")public void AfterThrowing(JoinPoint joinPoint,Exception e){System.out.println("The Method afterThrowing  ................"+e.getMessage().toString());}@Around(value="execution(* com.jeremy.aop.example.ArithmeticCalculator.*(..))")public Object aroundTest(ProceedingJoinPoint pjp){String methodName=pjp.getSignature().getName();Object object=null;try {// 前置通知System.out.println("The Method "+methodName+"before  ................");object=pjp.proceed();//返回通知System.out.println(object);} catch (Throwable e) {// TODO Auto-generated catch block//异常通知System.out.println(e.getMessage().toString());}System.out.println("The Method "+methodName+"    after  ................");return object;}
}

  

切面优先级:也就是切面运行的先后

      比如当我们一个系统涉及权限,日志,验证。。等等各种功能我们一般是需要先验证有没有这个权限,然后再打印日志,但是系统并不知道怎么去识别使用哪个切面

      所以我们就要硬性的规定一下优先使用哪个切面(使用@order注解既可以了)
示例:

    
     

声明切面表达式:在实际的开发中切面表达式可能被多个通知 重复利用,所以如果同意在一处声明就可能不用那么麻烦的去书写了
示例:

/*** 定义一个方法, 用于声明切入点表达式. 一般地, 该方法中再不需要添入其他的代码. * 使用 @Pointcut 来声明切入点表达式. * 后面的其他通知直接使用方法名来引用当前的切入点表达式. */@Pointcut("execution(public int com.atguigu.spring.aop.ArithmeticCalculator.*(..))")public void declareJointPointExpression(){}/*** 在 com.atguigu.spring.aop.ArithmeticCalculator 接口的每一个实现类的每一个方法开始之前执行一段代码*/@Before("declareJointPointExpression()")public void beforeMethod(JoinPoint joinPoint){String methodName = joinPoint.getSignature().getName();Object [] args = joinPoint.getArgs();System.out.println("The method " + methodName + " begins with " + Arrays.asList(args));}

  

转载于:https://www.cnblogs.com/jeremy-blog/p/4054841.html

Spring-AOP的五种通知和切面的优先级、通知变量声明相关推荐

  1. 从诸葛亮博望坡火烧曹军谈Spring AOP 的五种使用方式

    曹操自剿黄巾,讨董作,擒吕布,灭袁绍后,队伍达到鼎盛期,拥有兵将100余万,为了统一全国,派手下将领夏候淳领兵十万攻打新野.时当秋月,秋风徐起,夏侯惇引兵至博望坡,新野危在旦夕. 刘备请军师诸葛亮对策 ...

  2. Spring AOP的三种实现方式

    目录 一.什么是AOP 二.Spring AOP的三种实现方式 1.通过Spring API实现AOP (1)编写业务接口和实现类 (2)编写增强类,并实现Spring API相关接口的方法 (3)在 ...

  3. (一)、Spring Security OAuth2 五种授权方式介绍

    更多相关文章请见:Spring Security文章目录 1.简介 OAuth 2.0定义了五种授权方式. RFC规范链接 authorization_code:授权码类型,授权系统针对登录用户下发c ...

  4. JS五种运算符,运算符的优先级

    JS的运算符一共包括五种,下面我们来一个个的解说一下,开工~ 1.赋值运算符 符号:= 解释:这里的等号不是数学里面的相等,是赋值.在应用时,需要先把等号右边的表达式算出来结果,再赋值给左边. var ...

  5. spring aop的两种写法aspect和advisor

    本文转自:https://www.cnblogs.com/leiOOlei/p/3709607.html 首先看个例子,如下 接口代码: package com.lei.demo.aop.schema ...

  6. 将Bean注入Spring容器的五种方式

    将bean放入Spring容器中有哪些方式? 我们知道平时在开发中使用Spring的时候,都是将对象交由Spring去管理,那么将一个对象加入到Spring容器中,有哪些方式呢,下面我就来总结一下 1 ...

  7. Spring AOP的两种动态代理方式的原理和实现(JDK和CGLIB)

    代理机制 Spring 的AOP 部分使用使用JDK动态代理,部分使用CGLIB来为目标对象创建代理.如果被代理的目标对象实现了至少一个接口,则会使用JDK动态代理:如果目标对象没有实现任何接口,则会 ...

  8. Spring Aop(五)——给Advice传递参数

    5 给Advice传递参数 Advice除了可以接收JoinPoint(非Around Advice)或ProceedingJoinPoint(Around Advice)参数外,还可以直接接收与切入 ...

  9. Spring AOP:原理、 通知、连接点、切点、切面、表达式

    0:Spring AOP 原理 简单说说 AOP 的设计: 每个 Bean 都会被 JDK 或者 Cglib 代理.取决于是否有接口. 每个 Bean 会有多个"方法拦截器".注意 ...

最新文章

  1. lua的closure创建和使用
  2. 使用netty搭建一个简单的聊天室
  3. 兰州2021高考一诊成绩查询,2021兰州中考"一诊"成绩分析结果查询
  4. python中运算符号怎样表示_Python中的运算符与表达式
  5. 一文带你 GNN 从入门到起飞,做一个饭盆最稳 GNN 饭人!
  6. 特斯拉在华招聘太阳能和储能项目经理 屋顶光伏业务要来了?
  7. 计算机实训大纲,计算机专业实训大纲
  8. springboot2.x整合JavaMail以qq邮箱发送邮件
  9. Acrobat Pro DC 教程,如何将演示文稿转换为 PDF 文件?
  10. 性能测试常用的linux命令
  11. 油猴脚本(Tampermonkey)的简介
  12. 教学案例分析 计算机应用,计算机教学案例分析
  13. 2021 ICPC Gran Premio de Mexico 1ra Fecha
  14. 企业证书打包ipa文件(图文详解)
  15. 制作自己的图片数据集(附代码)
  16. 敏捷开发:一文了解影响地图和用户故事地图之间的那些事儿
  17. 超透镜仿真案例(2)—— 宽带消色差 超构透镜模型 FDTD仿真超表面
  18. AFNetworking 返回3840
  19. 方差、标准差、均方误差的总结
  20. [HNOI2006]鬼谷子的钱袋

热门文章

  1. 【转载】Asp.Net MVC3网站并成功的连接了MongoDB
  2. 多图详解教程:Eclipse 3.6连接Tomcat 7
  3. 谈谈“个人电子信息”的保护
  4. 解除IE8的内容审核程序
  5. 如何使对话框中接收到WM_CHAR消息(Windows编程)
  6. 深入理解Java Class反射机制
  7. 【全栈React】第6天: 状态
  8. php查找函数所在文件
  9. exchange 2010备份及恢复
  10. linux内核编译练习