spring-环绕通知 @Around
环绕通知
目标方法的前和后都能增加功能
在目标方法执行之前之后执行。被注解为环绕增强的方法要有返回值,Object 类型。并
且方法可以包含一个ProceedingJoinPoint 类型的参数。接口ProceedingJoinPoint 其有-一个
proceed()方法,用于执行目标方法。若目标方法有返回值,则该方法的返回值就是目标方法
的返回值。最后,环绕增强方法将其返回值返回。该增强方法实际是拦截了目标方法的执行。
环绕通知的方法定义
- public公共
- 必须有一个返回值,推荐使用Object
- 方法名称自定义
- 方法参数,固定的参数 ProceedingJoinPoint
使用:
属性:value 切入表达式
位置:在方法定义的上面 @Around
特点:
- 它是功能最强的通知
- 在目标方法的前和后都能增加功能
- 控制目标方法是否被调用执行 使用if判断来执行 object = pjd.proceed();
等同于method.invoke();—>就是 Object result = Dofirst(); - 修改原来的目标方法的执行结果。影响最后的调用结果
参数: ProceedingJoinPoint
作用:执行目标方法的
返回值: 就是目标方法执行结果,执行的结果可以被修改
接口:
public interface Someservice {String Dofirst(String name,int age);
}
接口实现类:
@Component("someService")
public class SomeserviceImpl implements Someservice {@Overridepublic String Dofirst(String name, int age) {System.out.println("------业务逻辑方法执行-------");return name;}
}
增强功能类:
@Component("myAspect3")
@Aspect
public class MyaspectJ {@Around(value = "execution(* *..SomeserviceImpl.Dofirst(..))")public Object myAspectJ(ProceedingJoinPoint pjd) throws Throwable {Object object =null;//在目标方法之前的功能增加System.out.println("调用的时间:"+new Date());// 1. 目标方法的调用object = pjd.proceed();System.out.println("事务的调用");//修改目标方法的返回值object= object+"2020;return object;}
}
配置文件:
<?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 http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"><context:component-scan base-package="cn.com.Ycy.spring_aspectJ.bao03"/><aop:aspectj-autoproxy/>
</beans>
测试类
@Testpublic void test04(){String config="Applicationcontext2.xml";ApplicationContext ac = new ClassPathXmlApplicationContext(config);//从容器获取目标对象cn.com.Ycy.spring_aspectJ.bao03.Someservice someservice = (cn.com.Ycy.spring_aspectJ.bao03.Someservice) ac.getBean("someService");//通过代理对象执行方法,实现目标方法执行时,增强了功能System.out.println("someservice:"+someservice.getClass().getName());String str = someservice.Dofirst("ycy",24); //就相当于调用 myAspectJ这个方法System.out.println(str);//someService}
输出结果
someservice:com.sun.proxy.$Proxy13
调用的时间:Mon Aug 03 17:56:13 CST 2020
------业务逻辑方法执行-------
事务的调用
ycy-2020
不用接口也是可以的,直接就是对普通类进行功能增强
普通类
@Component("someService1")
public class someService {public String Dofirst(String name, int age) {System.out.println("------业务逻辑方法执行-------");return name;}
}
功能增强类
@Component("myAspect3")
@Aspect
public class MyaspectJ {@Around(value = "execution(* *..someService.Dofirst(..))")public Object myAspectJ(ProceedingJoinPoint pjd) throws Throwable {Object object =null;//在目标方法之前的功能增加System.out.println("调用的时间:"+new Date());// 1. 目标方法的调用object = pjd.proceed();System.out.println("事务的调用");object= object+"-18204229";return object;}
}
总结
环绕通知:常用于做事务,事务开启,执行方法
使用接口的代理是 someservice:com.sun.proxy.Proxy13∗∗jdk动态代理∗∗∗∗不使用接口的是∗∗:someservice:cn.com.Ycy.springaspectJ.bao04.someServiceProxy13 **jdk动态代理** **不使用接口的是**: someservice:cn.com.Ycy.spring_aspectJ.bao04.someServiceProxy13∗∗jdk动态代理∗∗∗∗不使用接口的是∗∗:someservice:cn.com.Ycy.springaspectJ.bao04.someServiceEnhancerBySpringCGLIBEnhancerBySpringCGLIBEnhancerBySpringCGLIB$a489942e
是CGLIB代理
如果有接口,但是想使用CGLIB代理可以修改配置文件
<?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 http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"><context:component-scan base-package="cn.com.Ycy.spring_aspectJ.bao05"/><aop:aspectj-autoproxy proxy-target-class="true"/>
</beans>
spring-环绕通知 @Around相关推荐
- Spring环绕通知
Spring环绕通知 /*** @throws Throwable * @Around 环绕通知是spring中最强大的通知方法,其本身就是一个动态代理* * 通知方法* try{* @Before* ...
- Spring环绕通知Around
环绕通知 方法定义(作用十分强大) * 环绕通知* 1.是一个公共方法 public* 2.必须有返回值 推荐object的* 3.方法名称自定义*4.方法有固定的参数 ProceedingJoinP ...
- spring aop 环绕通知around和其他通知的区别
前言: spring 的环绕通知和前置通知,后置通知有着很大的区别,主要有两个重要的区别: 1) 目标方法的调用由环绕通知决定,即你可以决定是否调用目标方法,而前置和后置通知 是不能决定的,他们只 ...
- Spring框架----Spring的环绕通知
问题:当我们配置了环绕通知之后,切入点方法没有执行,而通知方法执行了 /*环绕通知 * 问题:当我们配置了环绕通知之后,切入点方法没有执行,而通知方法执行了 * */ public void arou ...
- spring之aop(前置通知,后置通知,环绕通知,过滤通知,异常通知)
1.AOP中关键性概念 连接点(Joinpoint):程序执行过程中明确的点,如方法的调用,或者异常的抛出 目标(Target):被通知(被代理)的对象 注1:完成具体的业务逻辑 通知(Advice ...
- (Spring笔记)AspectJ环绕通知——@Around切面开发
目录 一.前言 二.环绕通知切面开发 (1)环绕通知业务接口 (2)环绕通知业务接口实现 (3)环绕通知切面类 (4)applicati ...
- Spring Boot AOP面向切面编程使用(定义切入点、前置通知、后置通知、返回通知、异常通知、环绕通知)
1 AOP AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发 ...
- spring之AOP(面向切面编程)和五大通知(前置通知、后置通知、异常通知、环绕通知、过滤通知)
一.aop的介绍 1.AOP中关键性概念 : 连接点(Joinpoint):程序执行过程中明确的点,如方法的调用,或者异常的抛出. 目标(Target):被通知(被代理)的对象 注1:完成具体的业务逻 ...
- spring实现AOP环绕通知方式
spring实现AOP环绕通知方式 点关注不迷路,欢迎再来! 精简博客内容,尽量已行业术语来分享. 努力做到对每一位认可自己的读者负责. 帮助别人的同时更是丰富自己的良机. 目录 spring实现AO ...
- Spring的环绕通知
首先加入jar包: com.springsource.net.sf.cglib -2.2.0.jar com.springsource.org.aopalliance-1.0.0 .jar com.s ...
最新文章
- Java魔法堂:深入正则表达式API
- 拼多多创始人黄峥,要彻底卸下担子,搞“科研”去了。
- ES6新特性(函数默认参数,箭头函数)
- 复旦计算机学硕分数线,复旦大学2019考研分数线公布,复旦复试经验请收好!...
- python nlp文本摘要_理解文本摘要并用python创建你自己的摘要器
- python如何调用图片-用python简单处理图片(4):图像中的像素访问
- php 查询数据库 刷新,这个每次刷新都要去数据库里面查询一遍吗?
- mybatis 中SQLServer 和 mysql 模糊查询 不同点
- 一文搞懂JAVA与GO垃圾回收
- java 字符串子串_java实现字符串匹配求两个字符串的最大公共子串
- 【新媒体】现阶段新闻聚合的玩法
- Git回滚操作的总结
- javaweb教务管理系统_基于Java web的教务管理系统
- 用最科学的方法展示最形象的图表——前段数据可视化选型实践
- 2017android 最强旗舰,2017年世界六大旗舰机,华为第五,第一惊艳全球!
- 冒泡排序之Java实现
- StartDT奇点云邀您参加2022云栖大会,11月3-5日杭州见
- python tokenize()_tokenize (Language) – Python 中文开发手册 - Break易站
- 关于在li中使用阿里巴巴icon font导致文字不对齐的问题
- 一键查询自己名下所有微信账户
热门文章
- pos打印机指令java,如何从Delphi向POS打印机发送控制命令
- 巨噬细胞膜包裹PLGA纳米粒HCPT-MCNP/MCF-7细胞膜包覆PLGA纳米球共载姜黄素和二氢卟吩e6的研究
- MySql的初识感悟,以及sql语句中的DDL和DML和DQL的基本语法
- OV4689摄像头(MIPI)配置代码
- debug(调试工具)
- 调查显示我国4成人每周休闲不足10小时-休闲-带薪休假-上网
- jotform 设计器_使用JotForm 4.0减轻表单构建的痛苦
- Python 猴子选大王(约瑟夫环)算法
- Metasploit工具使用(下)
- 【普组模拟赛】马球比赛(polo.pas/cpp