Spring-AOP的五种通知和切面的优先级、通知变量声明
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的五种通知和切面的优先级、通知变量声明相关推荐
- 从诸葛亮博望坡火烧曹军谈Spring AOP 的五种使用方式
曹操自剿黄巾,讨董作,擒吕布,灭袁绍后,队伍达到鼎盛期,拥有兵将100余万,为了统一全国,派手下将领夏候淳领兵十万攻打新野.时当秋月,秋风徐起,夏侯惇引兵至博望坡,新野危在旦夕. 刘备请军师诸葛亮对策 ...
- Spring AOP的三种实现方式
目录 一.什么是AOP 二.Spring AOP的三种实现方式 1.通过Spring API实现AOP (1)编写业务接口和实现类 (2)编写增强类,并实现Spring API相关接口的方法 (3)在 ...
- (一)、Spring Security OAuth2 五种授权方式介绍
更多相关文章请见:Spring Security文章目录 1.简介 OAuth 2.0定义了五种授权方式. RFC规范链接 authorization_code:授权码类型,授权系统针对登录用户下发c ...
- JS五种运算符,运算符的优先级
JS的运算符一共包括五种,下面我们来一个个的解说一下,开工~ 1.赋值运算符 符号:= 解释:这里的等号不是数学里面的相等,是赋值.在应用时,需要先把等号右边的表达式算出来结果,再赋值给左边. var ...
- spring aop的两种写法aspect和advisor
本文转自:https://www.cnblogs.com/leiOOlei/p/3709607.html 首先看个例子,如下 接口代码: package com.lei.demo.aop.schema ...
- 将Bean注入Spring容器的五种方式
将bean放入Spring容器中有哪些方式? 我们知道平时在开发中使用Spring的时候,都是将对象交由Spring去管理,那么将一个对象加入到Spring容器中,有哪些方式呢,下面我就来总结一下 1 ...
- Spring AOP的两种动态代理方式的原理和实现(JDK和CGLIB)
代理机制 Spring 的AOP 部分使用使用JDK动态代理,部分使用CGLIB来为目标对象创建代理.如果被代理的目标对象实现了至少一个接口,则会使用JDK动态代理:如果目标对象没有实现任何接口,则会 ...
- Spring Aop(五)——给Advice传递参数
5 给Advice传递参数 Advice除了可以接收JoinPoint(非Around Advice)或ProceedingJoinPoint(Around Advice)参数外,还可以直接接收与切入 ...
- Spring AOP:原理、 通知、连接点、切点、切面、表达式
0:Spring AOP 原理 简单说说 AOP 的设计: 每个 Bean 都会被 JDK 或者 Cglib 代理.取决于是否有接口. 每个 Bean 会有多个"方法拦截器".注意 ...
最新文章
- lua的closure创建和使用
- 使用netty搭建一个简单的聊天室
- 兰州2021高考一诊成绩查询,2021兰州中考"一诊"成绩分析结果查询
- python中运算符号怎样表示_Python中的运算符与表达式
- 一文带你 GNN 从入门到起飞,做一个饭盆最稳 GNN 饭人!
- 特斯拉在华招聘太阳能和储能项目经理 屋顶光伏业务要来了?
- 计算机实训大纲,计算机专业实训大纲
- springboot2.x整合JavaMail以qq邮箱发送邮件
- Acrobat Pro DC 教程,如何将演示文稿转换为 PDF 文件?
- 性能测试常用的linux命令
- 油猴脚本(Tampermonkey)的简介
- 教学案例分析 计算机应用,计算机教学案例分析
- 2021 ICPC Gran Premio de Mexico 1ra Fecha
- 企业证书打包ipa文件(图文详解)
- 制作自己的图片数据集(附代码)
- 敏捷开发:一文了解影响地图和用户故事地图之间的那些事儿
- 超透镜仿真案例(2)—— 宽带消色差 超构透镜模型 FDTD仿真超表面
- AFNetworking 返回3840
- 方差、标准差、均方误差的总结
- [HNOI2006]鬼谷子的钱袋