SpringAOP的四种通知类型:前置通知、异常通知、后置通知、异常通知

一、四种常见的通知类型

给出 账户的业务层接口 IAccountService.java,

为了便于演示这四种通知类型,我们就只留下了一个方法。

public interface IAccountService {

void saveAccount();

}

给出 账户的业务层接口的实现类 AccountServiceImpl.java

public class AccountServiceImpl implements IAccountService{

@Override

public void saveAccount() {

System.out.println("执行了保存");

//int i=1/0;

}

}

给出一个日志类, 用于打印日志

public class Logger {

/**

* 前置通知

*/

public void beforePrintLog(){

System.out.println("前置通知Logger类中的beforePrintLog方法开始记录日志了。。。");

}

/**

* 后置通知

*/

public void afterReturningPrintLog(){

System.out.println("后置通知Logger类中的afterReturningPrintLog方法开始记录日志了。。。");

}

/**

* 异常通知

*/

public void afterThrowingPrintLog(){

System.out.println("异常通知Logger类中的afterThrowingPrintLog方法开始记录日志了。。。");

}

/**

* 最终通知

*/

public void afterPrintLog(){

System.out.println("最终通知Logger类中的afterPrintLog方法开始记录日志了。。。");

}

}

给出配置信息bean.xml

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:aop="http://www.springframework.org/schema/aop"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans.xsd

http://www.springframework.org/schema/aop

http://www.springframework.org/schema/aop/spring-aop.xsd">

注意:

1)异常通知和后置通知永远只能执行一个

2)配置切入点表达式

此标签写在aop:aspect标签内部只能当前切面使用。

它还可以写在aop:aspect外面,此时就变成了所有切面可用

给出Test类

public class AOPTest {

public static void main(String[] args) {

//1.获取容器

ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");

//2.获取对象

IAccountService as = (IAccountService)ac.getBean("accountService");

//3.执行方法

as.saveAccount();

}

}

执行结果:

当我们放开AccountServiceImpl类中我们故意制造的异常 int i=1/0;时:

二、环绕通知

环绕通知,只需要稍稍微改变上面例子的两点即可

(1)改动日志类 Logger.java

public class Logger {

public Object aroundPringLog(ProceedingJoinPoint pjp){

Object rtValue = null;

try{

Object[] args = pjp.getArgs();//得到方法执行所需的参数

System.out.println("Logger类中的aroundPringLog方法开始记录日志了。。。前置");

rtValue = pjp.proceed(args);//明确调用业务层方法(切入点方法)

System.out.println("Logger类中的aroundPringLog方法开始记录日志了。。。后置");

return rtValue;

}catch (Throwable t){

System.out.println("Logger类中的aroundPringLog方法开始记录日志了。。。异常");

throw new RuntimeException(t);

}finally {

System.out.println("Logger类中的aroundPringLog方法开始记录日志了。。。最终");

}

}

}

注意:pjp.proceed(args)会报异常,必须用 Throwable t,因为Exception拦不住它

(2)改动配置文件

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:aop="http://www.springframework.org/schema/aop"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans.xsd

http://www.springframework.org/schema/aop

http://www.springframework.org/schema/aop/spring-aop.xsd">

分析:

spring中的环绕通知是spring框架为我们提供的一种可以在代码中手动控制增强方法何时执行的方式。

Spring框架为我们提供了一个接口:ProceedingJoinPoint。该接口有一个方法proceed(),此方法就相当于明确调用切入点方法。该接口可以作为环绕通知的方法参数,在程序执行时,spring框架会为我们提供该接口的实现类供我们使用。

java 环绕通知_SpringAOP四种通知类型+环绕通知相关推荐

  1. Java内存分配(四种内存类型)

    Java的内存分为方法区.栈内存.堆内存.本地方法栈. 1.方法区(Method Area) 方法区存着类的代码(装载信息).常量池. 2.栈内存(Stacks) 存放参数和局部变量,存储数据量小,访 ...

  2. P2P穿透四种NAT类型

    P2P穿透&四种NAT类型 以下对四种NAT类型分别予以说明: 1.全锥形NAT IP.端口都不受限.只要客户端由内到外打通一个洞之后(NatIP:NatPort -> A:P1),其他 ...

  3. 对Java中常见的四种I/O模型理解

    对Java中常见的四种I/O模型理解 1.1 知识科普 1.1.1 同步阻塞I/O(Blocking I/O) 1.1.1.1 阻塞与非阻塞 1.1.1.2 同步与异步 1.1.1.3 同步阻塞I/O ...

  4. JAVA中的引用四种引用类型

    关于值类型和引用类型的话题,C++.JAVA.python.go.C#等等高级语言都有相关的概念,只要理解了其底层工作原理,可以说即使是不同的语言,在面试学习工作实践中都可以信手拈来(不要太纠集语言) ...

  5. Java 创建类的四种方式

    Java 创建类的四种方式 对于上学期已经学习过c++的同学,是不是对另一大编程语言产生了浓厚的兴趣,对于c++的面向对象编程,又和java的面向变量有何区别,下面我们从java四种创建对象来说起. ...

  6. python中内置的四种数值类型为_浅谈python语言四种数值类型

    Python语言支持四种不同的数值类型,包括int(整数)long(长整数)float(浮点实际值)complex (复数),本文章向码农介绍python 四种数值类型,需要的朋友可以参考一下.希望对 ...

  7. ospf的四种网络类型

    原文链接:https://blog.csdn.net/weixin_37945631/article/details/79498334 https://blog.csdn.net/qq_3921960 ...

  8. 详解Java解析XML的四种方法

    http://developer.51cto.com  2009-03-31 13:12  cnlw1985  javaeye  我要评论(8) XML现在已经成为一种通用的数据交换格式,平台的无关性 ...

  9. 卷积神经网络四种卷积类型

    卷积神经网络四种卷积类型 https://www.toutiao.com/a6631333810287936013/ 一般卷积 首先,我们需要就定义卷积层的一些参数达成一致. 卷积核大小(Kernel ...

  10. VMware vSphere四种迁移类型的区别与适应场景

    最近一直刚开始接触VMware vSphere这款虚拟化软件,每天的过程都是上午学新知识不理解,痛苦:下午实验各种出错,折磨:晚上回顾一天所学,五味陈杂,不过相比上午,下午已经好很多了.然后第二天依旧 ...

最新文章

  1. 开启灯光就是近光吗_保时捷Macan大灯改装技术,东莞专业豪车灯光改装修复。保时捷改LED大灯...
  2. mysql获取配置文件信息,四种获取MySQL数据库配置文件加载顺序
  3. using namespace cv_闪耀暖暖万圣节非凡魔女南瓜套公开 消耗钻石获取 大喵无CV
  4. Integer的cache缓存问题
  5. redis源码阅读(1)
  6. oracle usehash,/*+use_hash(t1 t2)*/的神奇
  7. struts2在Action中访问Session,管理员删除用户
  8. chm editor
  9. 类特征注意机制融合Deeplabv3+语义分割
  10. python发音翻译-Python translate()方法
  11. 2019大数据分析软件介绍
  12. 当里皮也成过客,请善待国足主帅的继任者
  13. halcon基本操作
  14. react中类组件this的指向问题
  15. GIS开发学习推荐书目
  16. 关于EOSUNION 的商业创业大赛的一点心得
  17. matlab制作圆摆线动画
  18. 智慧环保大数据可视化系统建设
  19. PAOGD个人作业3——OpenGL,实现模型自身的旋转,平移,缩放
  20. 计算机多媒体教室工作总结,多媒体年终工作总结范文精选

热门文章

  1. Oblog4.5跨站漏洞
  2. 简单实用的vue常用后台管理模板框架
  3. oracle recover database,recover database until cancel和 recover database区别
  4. 手机与个人计算机区别,手机CPU跟电脑CPU有什么差别?两者差距到底有多大?
  5. Spark应用提交后一直不运行:hadoop-yarn ACCEPTED: waiting for AM container to be allocated, launched and registe
  6. AutoCAD2022下载安装教程
  7. 必须知道的python专属骚技巧25例
  8. 基于单片机的超声波测距仪的设计
  9. 爬虫实战---爬取猫眼电影
  10. 离线渲染与实时渲染杂谈 ——从发布会上的产品展示说起