最近写的项目里面都用到了很多切面,切点的知识,写完以后,来自我总结一下:

举个例子:
一个类(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()方法了。

  1. 通知、增强处理(Advice): 就是你想要的功能,你给先定义好,然后在想用的地方用一下,包含Aspect的一段处理代码。
  2. 连接点(JoinPoint): 就是spring允许你是通知(Advice)的地方,基本每个方法的前、后(两者都有也行),或抛出异常时都可以是连接点,spring只支持方法连接点。其他如AspectJ还可以让你在构造器或属性注入时都行,不过只要记住,和方法有关的前前后后都是连接点。连接点就是为了获取切点方法的相关信息(所在的类、入参、方法等)
  3. 切入点(Pointcut) :上面说的连接点的基础上,来定义切入点,你的一个类里,有15个方法,那就有十几个连接点了,但是并不想在所有方法附近都使用通知(使用叫织入),只是想让其中几个,在调用这几个方法之前、之后或者抛出异常时干点什么,那么就用切入点来定义这几个方法,让切点来筛选连接点,选中那几个你想要的方法。
  4. 切面(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的理解相关推荐

  1. spring aop中pointcut表达式

    spring aop中pointcut表达式 本文主要介绍spring aop中9种切入点表达式的写法 execute within this target args @target @within ...

  2. Spring AOP中pointcut 切点详解

    Spring AOP中pointcut 是指那些方法需要被执行"AOP",是由"Pointcut Expression"来描述的. Pointcut可以有下列方 ...

  3. 【源码】Spring AOP 4 Pointcut

    [源码]Spring AOP 4 Pointcut 前言 Pointcut ClassFilter AnnotationClassFilter AnnotationCandidateClassFilt ...

  4. Spring AOP中Pointcut,dvice 和 Advisor三个概念

    Spring  AOP中Pointcut,dvice 和 Advisor三个概念介绍 在理解了Spring的AOP后,需要重点理解的三个概念是:Pointcut    Advice   Advisor ...

  5. 【老王读Spring AOP-3】Spring AOP 执行 Pointcut 对应的 Advice 的过程

    Spring AOP 执行 Pointcut 对应的 Advice 的过程 前言 版本约定 正文 jdk proxy 是如何执行 Pointcut 对应的 Advice 的? 获取 Advice 链的 ...

  6. Spring AOP切入点@Pointcut -- execution表达式

    Spring AOP 切入点@Pointcut – execution表达式 表达式示例 execution(* com.sample.service.impl..*.*(..)) 详述: execu ...

  7. SpringAOP专题之6、Spring AOP中@Pointcut 12种用法

    本文主要内容:掌握@Pointcut的12种用法. Aop相关阅读 阅读本文之前,需要先掌握下面几篇篇文章内容,不然会比较吃力. 代理详解(java动态代理&CGLIB代理) jdk动态代理和 ...

  8. Spring AOP AspectJ Pointcut Expressions With Examples--转

    原文地址:http://howtodoinjava.com/spring/spring-aop/writing-spring-aop-aspectj-pointcut-expressions-with ...

  9. Spring AOP中pointcut expression表达式解析

    Pointcut 是指那些方法需要被执行"AOP",是由"Pointcut Expression"来描述的. Pointcut可以有下列方式来定义或者通过&am ...

  10. Spring AOP 切点 Pointcut 表达式介绍与使用

    一.前言 面向切面编程 AOP 是一种常见的编程思想,是面向对象编程的一种补充,AOP 框架通过修改源代码,将处理逻辑编织到指定的业务模块中 常见的处理比如:在方执行法前进行校验,在方法执行后进行日志 ...

最新文章

  1. jquery 取消 radio checked 属性,重新选中的问题解决
  2. Java 8 开发的 4 大技巧
  3. Android跨进程通信二——AIDL
  4. C++palindrome partitioning回文分割算法的实现(附完整源码)
  5. css的属性是变量是怎么表达,CSS自定义变量属性——像less,sass那样在css中使用变量(译)...
  6. 台积电6月营收环比大增 或预示苹果A14处理器已大规模出货
  7. 在chrome开发者工具中观察函数调用栈、作用域链、闭包
  8. python监控服务器信息进行可视化_Python实现数据可视化,看如何监控你的爬虫
  9. shell基础之变量及表达式
  10. c++ 聚合/POD/平凡/标准布局 介绍
  11. Mac 如何删除应用、软件
  12. 在EPICS定义一个新的记录类型
  13. Java 高并发第二阶段实战---高并发设计模式,内存模型,CPU一致性协议,volatile关键字剖析
  14. 电机控制系统php,步进电机调速控制系统资料(原理图+单片机源码)
  15. 多元线性回归—多重共线性
  16. BlueCms v1.6 本地文件包含漏洞代码审计
  17. IDEA中Artifact的配置
  18. Linux vsftp
  19. Unity优化☀️渲染篇:CPU/GPU
  20. 如何转发微信5.0的语音

热门文章

  1. LOJ6031 「雅礼集训 2017 Day1」字符串 SAM、根号分治
  2. 关于String s = new String(xyz); 创建几个对象的问题
  3. 【nginx】nginx的工作模式和信号量控制
  4. android 数据存储之 读写文件
  5. spring security退出方法
  6. Java 基础系列-LocalDate相关
  7. Spring Boot + thymeleaf 后台与页面(二)
  8. Codeforces Round #453 (Div. 1)
  9. Python全栈_Day5_用户、群组、权限
  10. java面试题汇总(1)