热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Spring——AOP中五大通知功能的执行顺序(完全注解开发)

Spring——AOP中五大通知功能的执行顺序(完全注解开发)1.前言Spring大家肯定都用过的,IOC和AOP是它的两大核心,那么这篇文章主要和大家分享一下如果对一个方法声明

Spring——AOP中五大通知功能的执行顺序(完全注解开发)


1.前言

Spring大家肯定都用过的,IOC和AOP是它的两大核心,那么这篇文章主要和大家分享一下如果对一个方法声明了切面、添加了五种通知,它们的执行顺序是怎样的呢?

由于之前学Spring的时候写过太多了xml配置了,所以这篇文章采用完全注解开发的方式来实现。





2.项目源码

首先是pom文件,我们添加所需依赖。


  1. <dependency>
  2. <groupId>org.springframeworkgroupId>
  3. <artifactId>spring-contextartifactId>
  4. <version>5.2.5.RELEASEversion>
  5. dependency>
  6. <dependency>
  7. <groupId>org.springframeworkgroupId>
  8. <artifactId>spring-aspectsartifactId>
  9. <version>5.2.5.RELEASEversion>
  10. dependency>
  11. <dependency>
  12. <groupId>junitgroupId>
  13. <artifactId>junitartifactId>
  14. <version>4.11version>
  15. <scope>testscope>
  16. dependency>

接下来我们来一个业务接口以及它的实现类。


  1. package com.szh.service;
  2. /**
  3. *
  4. */
  5. public interface SomeService {
  6. String doSome(String name,Integer age);
  7. }

由于我们不写xml配置,所以需要在业务接口实现类上添加 @Service 注解,通过注解将这个类交给Spring IOC容器管理。 


  1. package com.szh.service.impl;
  2. import com.szh.service.SomeService;
  3. import org.springframework.stereotype.Service;
  4. @Service
  5. public class SomeServiceImpl implements SomeService {
  6. @Override
  7. public String doSome(String name, Integer age) {
  8. //int a = 10 / 0; //用于测试异常通知
  9. System.out.println("业务方法doSome(),创建商品的订单");
  10. return "姓名:" + name + ",年龄:" + age;
  11. }
  12. }

然后是我们的切面类,同上面的业务实现类,也需要使用 @Component 注解将这个类交给Spring IOC容器管理。 


  1. package com.szh.handle;
  2. import org.aspectj.lang.ProceedingJoinPoint;
  3. import org.aspectj.lang.annotation.*;
  4. import org.springframework.stereotype.Component;
  5. @Aspect
  6. @Component
  7. public class MyAspect {
  8. @Before(value = "myPointCut()")
  9. public void myBefore() {
  10. System.out.println("前置通知,在目标方法之前先执行的....");
  11. }
  12. @AfterReturning(value = "myPointCut()", returning = "obj")
  13. public void myAfterReturning(Object obj) {
  14. System.out.println("后置通知,在目标方法之后再执行的(如有异常,则后置通知不会执行).... 目标方法返回值:" + obj);
  15. }
  16. @Around(value = "myPointCut()")
  17. public Object myAround(ProceedingJoinPoint joinPoint) throws Throwable {
  18. System.out.println("环绕通知中前置通知的功能....");
  19. Object obj = joinPoint.proceed();
  20. System.out.println("环绕通知中后置通知的功能....");
  21. return obj;
  22. }
  23. @AfterThrowing(value = "myPointCut()", throwing = "e")
  24. public void myAfterThrowing(Exception e) {
  25. System.out.println("异常通知,在目标方法抛出异常时执行的,异常原因是:" + e.getMessage());
  26. }
  27. @After(value = "myPointCut()")
  28. public void myAfter() {
  29. System.out.println("最终通知,总是会被执行的....");
  30. }
  31. @Pointcut(value = "execution(* com.szh.service.impl.*.do*(..))")
  32. private void myPointCut() {
  33. //无需代码
  34. }
  35. }

最后再来个配置类,在这个配置类中开启要替代xml配置文件的相关功能。


  1. package com.szh.config;
  2. import org.springframework.context.annotation.Bean;
  3. import org.springframework.context.annotation.ComponentScan;
  4. import org.springframework.context.annotation.Configuration;
  5. import org.springframework.context.annotation.EnableAspectJAutoProxy;
  6. /**
  7. *
  8. */
  9. @Configuration
  10. //开启包扫描功能,相当于xml中的
  11. @ComponentScan(basePackages = "com.szh")
  12. //开启aop自动代理功能,相当于xml中的
  13. @EnableAspectJAutoProxy
  14. public class MyConfig {
  15. }

最后是测试类。


  1. package com.szh;
  2. import com.szh.config.MyConfig;
  3. import com.szh.service.SomeService;
  4. import org.junit.Test;
  5. import org.springframework.context.ApplicationContext;
  6. import org.springframework.context.annotation.AnnotationConfigApplicationContext;
  7. /**
  8. *
  9. */
  10. public class MyTest {
  11. @Test
  12. public void testAnnotationAop() {
  13. ApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class);
  14. SomeService service = (SomeService) context.getBean("someServiceImpl");
  15. String info = service.doSome("张起灵", 20);
  16. System.out.println(info);
  17. }
  18. }

2.1 无异常的执行结果


2.2 有异常的执行结果

https://blog.csdn.net/weixin_43823808/article/details/125460170



推荐阅读
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • 开发笔记:spring boot项目打成war包部署到服务器的步骤与注意事项
    本文介绍了将spring boot项目打成war包并部署到服务器的步骤与注意事项。通过本文的学习,读者可以了解到如何将spring boot项目打包成war包,并成功地部署到服务器上。 ... [详细]
  • Java如何导入和导出Excel文件的方法和步骤详解
    本文详细介绍了在SpringBoot中使用Java导入和导出Excel文件的方法和步骤,包括添加操作Excel的依赖、自定义注解等。文章还提供了示例代码,并将代码上传至GitHub供访问。 ... [详细]
  • 第七课主要内容:多进程多线程FIFO,LIFO,优先队列线程局部变量进程与线程的选择线程池异步IO概念及twisted案例股票数据抓取 ... [详细]
  • 基于分布式锁的防止重复请求解决方案
    一、前言关于重复请求,指的是我们服务端接收到很短的时间内的多个相同内容的重复请求。而这样的重复请求如果是幂等的(每次请求的结果都相同,如查 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • Python教学练习二Python1-12练习二一、判断季节用户输入月份,判断这个月是哪个季节?3,4,5月----春 ... [详细]
author-avatar
aotu蛮
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有