spring AOP @Aspect,@pointcut的理解
最近写的项目里面都用到了很多切面,切点的知识,写完以后,来自我总结一下:
举个例子:
一个类(Show)里面有一个表演(display)的方法,在表演之前,应该有致辞(say)的方法,在表演之后,应该有鼓掌(hand)的方法。
为了高内聚低耦合,表演的方法应该单独封装在一个类里面,致辞和鼓掌的方法应该另外封装,但在调用时必须按照顺序来调用执行。这时候就需要设置切面和切点了!
切面应该设置在致辞(say)和鼓掌(hand)方法所在的类上面,同时,要在类里面配置切点,类似:
//定义切点--功能权限更新com.eastcom.bbf.bs.management.service
@Pointcut("execution( com.eastcom.bbf.bs.management.service.FunctionRightsService.updateFunctionRight(..))")private void updateFunctionRightPointCut() {// 这是一个标记方法}* 》》即:@PointCut()里面应该配置 表演(display)方法的路径
如果上面没有定义标记方法,则下面的pointcut 应该等于"execution(......)"@AfterReturning(pointcut = "updateFunctionRightPointCut()",returning = "rvt")public void afterUpdateFunctionRight(JoinPoint joinPoint,String rvt) {**// 此方法是在切入点方法执行之后执行**// joinPoint.getArgs() 就是获取切入点方法的入参// rvt 就是切入点方法的返回值..............》》此方法相当于 鼓掌(hand)方法。}
@Before("updateFunctionRightPointCut()")public void beforeSaveServiceNode(JoinPoint joinPoint) {** // 此方法在切入点之前执行**ServiceNode node = (ServiceNode) joinPoint.getArgs()[0];.............》》此方法相当于 致辞(say) 方法。}
这样配置完成时,在调用display(切入点)方法时,就会自动调用致辞(say)和鼓掌(hand)方法了。
测试类似代码时,应该在切点的方法里面打断点,然后在想要执行的方法里面打断点。
此外,在项目中遇到一个问题就是,调用不到一个类中的一个方法。然后也可以通过设置切点、切面来解决。
如:
XXFilter类里面有个 updateInit()方法,因为是filter不能自动注入,外面无法调用这个方法。br/>解决:
自己写一个XXService类(设置自动注入@Service),在里面定义一个update()方法,方法体内为空,
在XXFilter类上面设置@Aspect,在里面设置@PointCut(“execution(update()方法的路径)”),
然后
@AfterReturning(...)
void xxUpdate(){// 在里面只是调用updateInit()方法。updateInit( )
}
这样就可以通过 XXService调用update()方法来调用updateInit()方法了。
- 通知、增强处理(Advice): 就是你想要的功能,你给先定义好,然后在想用的地方用一下,包含Aspect的一段处理代码。
- 连接点(JoinPoint): 就是spring允许你是通知(Advice)的地方,基本每个方法的前、后(两者都有也行),或抛出异常时都可以是连接点,spring只支持方法连接点。其他如AspectJ还可以让你在构造器或属性注入时都行,不过只要记住,和方法有关的前前后后都是连接点。连接点就是为了获取切点方法的相关信息(所在的类、入参、方法等)
- 切入点(Pointcut) :上面说的连接点的基础上,来定义切入点,你的一个类里,有15个方法,那就有十几个连接点了,但是并不想在所有方法附近都使用通知(使用叫织入),只是想让其中几个,在调用这几个方法之前、之后或者抛出异常时干点什么,那么就用切入点来定义这几个方法,让切点来筛选连接点,选中那几个你想要的方法。
- 切面(Aspect) :切面是通知和切入点的结合。连接点就是为了方便理解切点的,明白这个概念就行了。通知说明了干什么和什么时候干(什么时候通过方法名中的befor,after,around等就能知道),切入点说明了在哪干(指定到底是哪个方法),这就是一个完整的切面定义。
@Aspect //声明切面,标记类
public class Wly { @Pointcut("execution(* *.perform(..))") //定义切点,标记方法
public void performance() {} @Before("performance()") //切点之前执行
public .... @AfterReturning("performance()") //切点执行成功之后执行
public ...
// @After("....") // 在切点之后执行,无论方法执行成功与否@AfterThrowing("performance()") //切点抛出异常后执行
public ...
}
spring AOP @Aspect,@pointcut的理解相关推荐
- spring aop中pointcut表达式
spring aop中pointcut表达式 本文主要介绍spring aop中9种切入点表达式的写法 execute within this target args @target @within ...
- Spring AOP中pointcut 切点详解
Spring AOP中pointcut 是指那些方法需要被执行"AOP",是由"Pointcut Expression"来描述的. Pointcut可以有下列方 ...
- 【源码】Spring AOP 4 Pointcut
[源码]Spring AOP 4 Pointcut 前言 Pointcut ClassFilter AnnotationClassFilter AnnotationCandidateClassFilt ...
- Spring AOP中Pointcut,dvice 和 Advisor三个概念
Spring AOP中Pointcut,dvice 和 Advisor三个概念介绍 在理解了Spring的AOP后,需要重点理解的三个概念是:Pointcut Advice Advisor ...
- 【老王读Spring AOP-3】Spring AOP 执行 Pointcut 对应的 Advice 的过程
Spring AOP 执行 Pointcut 对应的 Advice 的过程 前言 版本约定 正文 jdk proxy 是如何执行 Pointcut 对应的 Advice 的? 获取 Advice 链的 ...
- Spring AOP切入点@Pointcut -- execution表达式
Spring AOP 切入点@Pointcut – execution表达式 表达式示例 execution(* com.sample.service.impl..*.*(..)) 详述: execu ...
- SpringAOP专题之6、Spring AOP中@Pointcut 12种用法
本文主要内容:掌握@Pointcut的12种用法. Aop相关阅读 阅读本文之前,需要先掌握下面几篇篇文章内容,不然会比较吃力. 代理详解(java动态代理&CGLIB代理) jdk动态代理和 ...
- Spring AOP AspectJ Pointcut Expressions With Examples--转
原文地址:http://howtodoinjava.com/spring/spring-aop/writing-spring-aop-aspectj-pointcut-expressions-with ...
- Spring AOP中pointcut expression表达式解析
Pointcut 是指那些方法需要被执行"AOP",是由"Pointcut Expression"来描述的. Pointcut可以有下列方式来定义或者通过&am ...
- Spring AOP 切点 Pointcut 表达式介绍与使用
一.前言 面向切面编程 AOP 是一种常见的编程思想,是面向对象编程的一种补充,AOP 框架通过修改源代码,将处理逻辑编织到指定的业务模块中 常见的处理比如:在方执行法前进行校验,在方法执行后进行日志 ...
最新文章
- jquery 取消 radio checked 属性,重新选中的问题解决
- Java 8 开发的 4 大技巧
- Android跨进程通信二——AIDL
- C++palindrome partitioning回文分割算法的实现(附完整源码)
- css的属性是变量是怎么表达,CSS自定义变量属性——像less,sass那样在css中使用变量(译)...
- 台积电6月营收环比大增 或预示苹果A14处理器已大规模出货
- 在chrome开发者工具中观察函数调用栈、作用域链、闭包
- python监控服务器信息进行可视化_Python实现数据可视化,看如何监控你的爬虫
- shell基础之变量及表达式
- c++ 聚合/POD/平凡/标准布局 介绍
- Mac 如何删除应用、软件
- 在EPICS定义一个新的记录类型
- Java 高并发第二阶段实战---高并发设计模式,内存模型,CPU一致性协议,volatile关键字剖析
- 电机控制系统php,步进电机调速控制系统资料(原理图+单片机源码)
- 多元线性回归—多重共线性
- BlueCms v1.6 本地文件包含漏洞代码审计
- IDEA中Artifact的配置
- Linux vsftp
- Unity优化☀️渲染篇:CPU/GPU
- 如何转发微信5.0的语音
热门文章
- LOJ6031 「雅礼集训 2017 Day1」字符串 SAM、根号分治
- 关于String s = new String(xyz); 创建几个对象的问题
- 【nginx】nginx的工作模式和信号量控制
- android 数据存储之 读写文件
- spring security退出方法
- Java 基础系列-LocalDate相关
- Spring Boot + thymeleaf 后台与页面(二)
- Codeforces Round #453 (Div. 1)
- Python全栈_Day5_用户、群组、权限
- java面试题汇总(1)