目录

一、前言

二、环绕通知切面开发

        (1)环绕通知业务接口

        (2)环绕通知业务接口实现

        (3)环绕通知切面类

        (4)applicationContext.xml配置文件

四、junit代码测试

五、总结


本章学习源码Github地址:https://github.com/GuiZhouAndroid/MySpringAllProject/tree/master/SpringDemo09_AspectJ/src/main/java/com/dhrj/java/zsitking/around


一、前言

        环绕通知:通过拦截目标方法的方式 ,在目标方法前后增强功能的通知,是功能最强大的通知,一般事务使用此通知,此外环绕通知可以轻易的改变目标方法的返回值。


二、环绕通知切面开发

(1)环绕通知业务接口

public interface AroundService {//我的信息String myInfo(String name, int age);
}

(2)环绕通知业务接口实现

@Service //Spring的IOC注解式创建业务逻辑层实例
public class AroundServiceImpl implements AroundService {@Overridepublic String myInfo(String name, int age) {System.out.println("myInfo(String name, int age)已执行...");return "我的个人信息 = 姓名:" + name + ",年龄:" + age;}
}

(3)环绕通知切面类

@Aspect //交给AspectJ的框架去识别切面类
@Component //切面实例注册加载到spring容器中
public class AroundAspectJ {/*** 环绕通知方法的规范* (1)访问权限是public* (2)切面方法有返回值,此返回值就是目标方法的返回值* (3)方法名称自定义* (4)方法有参数,此参数就是目标方法* (5)回避异常Throwable* (6)使用@Around注解声明是环绕通知* 参数:* value:指定切入点表达式*/@Around(value = "execution(* com.dhrj.java.zsitking.around.impl.*.*(..))")public Object myAround(ProceedingJoinPoint pjp) throws Throwable {//1.前切功能实现System.out.println("环绕通知中的前置功能实现...");//2.目标方法调用——>重点调用Object obj = pjp.proceed(pjp.getArgs());//返回值obj即为目标方法的返回值,参数是目标方法的参数(有参数或无参数都不影响)//3.后切功能实现System.out.println("环绕通知中的后置功能实现...");return obj.toString() + ",环绕通知已修改此返回值";   //拦截目标方法并改变了目标方法的返回值}
}

(4)applicationContext.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"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/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd"><!--基于注解的访问要添加包扫描--><context:component-scan base-package="com.dhrj.java.zsitking.around"/><!--业务实现绑定AOP,默认是JDK动态代理,取时必须使用接口类型--><aop:aspectj-autoproxy/>
</beans>

四、junit代码测试

   @Testpublic void testAround() {ApplicationContext ac = new ClassPathXmlApplicationContext("around/applicationContext.xml");AroundService aroundServiceImpl = (AroundService) ac.getBean("aroundServiceImpl");System.out.println("环绕通知最终返回值:" + aroundServiceImpl.myInfo("张松", 20));}

        结论:@Around注解声明的方法在目标方法执行之前之后执行。被@Around注解为环绕增强的方法要有Object 类型返回值。并且方法可以包含一个ProceedingJoinPoint类型的参数。接口ProceedingJoinPoint其有一个proceed()方法,用于执行目标方法。若目标方法有返回值,则该方法的返回值就是目标方法的返回值。最后,环绕增强方法将其返回值返回。该增强方法实际是拦截了目标方法的执行。


五、总结

仅自己学习记录,如有错误,敬请谅解~,谢谢~~~

(Spring笔记)AspectJ环绕通知——@Around切面开发相关推荐

  1. spring实现AOP环绕通知方式

    spring实现AOP环绕通知方式 点关注不迷路,欢迎再来! 精简博客内容,尽量已行业术语来分享. 努力做到对每一位认可自己的读者负责. 帮助别人的同时更是丰富自己的良机. 目录 spring实现AO ...

  2. Spring的环绕通知

    首先加入jar包: com.springsource.net.sf.cglib -2.2.0.jar com.springsource.org.aopalliance-1.0.0 .jar com.s ...

  3. 关于 Spring AOP (AspectJ) 你该知晓的一切

    [版权申明]未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/54629058 出自[zejian ...

  4. Spring Boot AOP面向切面编程使用(定义切入点、前置通知、后置通知、返回通知、异常通知、环绕通知)

    1 AOP AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发 ...

  5. spring之AOP(面向切面编程)和五大通知(前置通知、后置通知、异常通知、环绕通知、过滤通知)

    一.aop的介绍 1.AOP中关键性概念 : 连接点(Joinpoint):程序执行过程中明确的点,如方法的调用,或者异常的抛出. 目标(Target):被通知(被代理)的对象 注1:完成具体的业务逻 ...

  6. spring aop 环绕通知around和其他通知的区别

    前言: spring 的环绕通知和前置通知,后置通知有着很大的区别,主要有两个重要的区别: 1) 目标方法的调用由环绕通知决定,即你可以决定是否调用目标方法,而前置和后置通知   是不能决定的,他们只 ...

  7. Spring使用AspectJ开发AOP

    AspectJ 是一个基于 Java 语言的 AOP 框架,它扩展了 Java 语言.Spring 2.0 以后,新增了对 AspectJ 方式的支持,新版本的 Spring 框架,建议使用 Aspe ...

  8. (转)Spring使用AspectJ进行AOP的开发:注解方式

    http://blog.csdn.net/yerenyuan_pku/article/details/69790950 Spring使用AspectJ进行AOP的开发:注解方式 之前我已讲过Sprin ...

  9. spring22:Aspectj实现环绕通知@Around

    切面类: package com.atChina.Test3;import org.aspectj.lang.JoinPoint; import org.aspectj.lang.Proceeding ...

最新文章

  1. SqlServer2008查询性能优化_第一章
  2. 【J2EE之web应用】java集群概念
  3. python数据清理的实践总结_Python数据清洗实践
  4. C++ 异常类型以及多级catch匹配
  5. Java 的 安全性 体现在哪里?面试题
  6. Idea导入web工程,并运行
  7. java textvaluechanged 全选删除不触发_js动态改变input的值不触发input的change事件的解决办法...
  8. LeetCode 410. Split Array Largest Sum
  9. SPSS问卷中的人口学变量是否要用?以及如何选用?【SPSS 065期】
  10. 重庆计算机c语言二级成绩查询,历届重庆市计算机C语言二级考试试题及答案.pdf...
  11. 深度强化Q学习-基于微软AirSim仿真环境的自动驾驶案例(原理代码详解简易可行)
  12. 《Java从入门到放弃》JavaSE入门篇:单元测试
  13. 知富柜台系统服务器,商业银行柜面无纸化安全解决方案
  14. Python 实现 批量 复制指定PDF文件 到指定文件夹并批量打印出来
  15. 如何开启Windows共享文件夹服务
  16. As I Please--PartⅠ
  17. Spring入门实例
  18. P93-好玩游戏的物品清单
  19. 【故障•监听】TNS-12518、TNS-00517和 Linux Error:32:Broken pipe
  20. C++部署深度学习模型

热门文章

  1. Structural Deep Embedding for Hyper-Networks
  2. OUC2021软件工程OUC拼车程序小组Gamma阶段博客目录
  3. 知名人脸搜索引擎惹众怒:仅需一张照片,几秒钟把你扒得底裤不剩
  4. dedecms织梦后台不显示模块管理和辅助插件
  5. SESSION_CACHED_CURSORS 参数
  6. PHP对接支付宝当面付详细教程
  7. IT运维:服务器管理
  8. 为什么大部分公司的数据库系统仍然要使用oracle?
  9. 回归预测 | MATLAB实现SSA-BP多输入单输出回归预测
  10. 生产制造管理系统MES