当前位置:首页 > 科技  > 软件

你了解Spring AOP的这个技能点吗?有什么应用场景?

来源: 责编: 时间:2023-12-08 09:13:55 158观看
导读环境:Spring5.3.231. 介绍今天看Spring文档看到这么一个知识点《Control Flow Pointcuts》都不好翻译官方原文:Spring control flow pointcuts are conceptually similar to AspectJ cflow pointcuts, although less po

环境:Spring5.3.23mNQ28资讯网——每日最新资讯28at.com

1. 介绍

今天看Spring文档看到这么一个知识点《Control Flow Pointcuts》都不好翻译

mNQ28资讯网——每日最新资讯28at.com

mNQ28资讯网——每日最新资讯28at.com

官方原文:mNQ28资讯网——每日最新资讯28at.com

Spring control flow pointcuts are conceptually similar to AspectJ cflow pointcuts, although less powerful. (There is currently no way to specify that a pointcut runs below a join point matched by another pointcut.) A control flow pointcut matches the current call stack. For example, it might fire if the join point was invoked by a method in the com.mycompany.web package or by the SomeCaller class. Control flow pointcuts are specified by using the org.springframework.aop.support.ControlFlowPointcut class.mNQ28资讯网——每日最新资讯28at.com

大意:Spring控制流切入点在概念上类似于aspectj cflow切入点,尽管功能不那么强大。(目前还没有办法指定一个切入点在与另一个切入点匹配的连接点下面运行。)控制流切入点与当前调用堆栈匹配。例如,如果连接点由com.mycompany.web包中的方法或someecaller类调用,则可能会触发该连接点。控制流切入点是通过使用org.springframework.aop.support.ControlFlowPointcut类指定的。mNQ28资讯网——每日最新资讯28at.com

其实看完这个,可能你还是不懂什么意思,接下来我们来跑一个实例,就能明白撒意思了。mNQ28资讯网——每日最新资讯28at.com

2. Control Flow实例

准备几个方法嵌套调用的类mNQ28资讯网——每日最新资讯28at.com

static class PersonDAO {  public void save(String name) {    System.out.println("PersonDAO save method invoke...") ;  }}static class PersonService {  private PersonDAO dao ;  public PersonService(PersonDAO dao) {    this.dao = dao ;  }  public void save(String name) {    System.out.println("PersonService save method inovke...") ;    this.dao.save(name) ;  }}static class PersonManager {  private PersonService ps ;  public void setPs(PersonService ps) {    this.ps = ps ;  }  public void index(String name) {    System.out.println("PersonManager index method invoke...") ;    this.ps.save(name) ;  }}

上面的类及方法调用非常简单:PersonManager ---> PersonService ---> PersonDAO。接下来是通过编程的方式创建PersonService代理对象。mNQ28资讯网——每日最新资讯28at.com

// 实例化上面的类PersonDAO dao = new PersonDAO() ;PersonService target = new PersonService(dao) ;PersonManager pm = new PersonManager() ;Class<?> clazz = PersonManager.class ;String methodName = "index" ;// 定义切入点ControlFlowPointcut pointcut = new ControlFlowPointcut(clazz, methodName) ;// 定义通知MethodInterceptor logInterceptor = invocation -> {  System.out.println("before log...") ;  Object ret = invocation.proceed() ;  System.out.println("after log...") ;  return ret ;} ;// 定义切面DefaultPointcutAdvisor advisor = new DefaultPointcutAdvisor(pointcut, logInterceptor) ;// 通过ProxyFactory创建代理对象,创建的是PersonService对象的代理ProxyFactory factory = new ProxyFactory(target) ;factory.addAdvisor(advisor) ;// 基于CGLIB生成代理factory.setProxyTargetClass(true) ;PersonService ps = (PersonService) factory.getProxy() ;pm.setPs(ps) ;pm.index("张三") ;

控制台输出mNQ28资讯网——每日最新资讯28at.com

PersonManager index method invoke...before log...PersonService save method inovke...PersonDAO save method invoke...after log...

从输出的结果发现,在PersonService#save方法之前之前和之后分别打印了日志信息。原理是什么呢?这里我们需要先看ControlFlowPointcut 切入点是如何工作的。mNQ28资讯网——每日最新资讯28at.com

ControlFlowPointcut核心方法

这里只列出了几个重要的方法,在spring中只支持方法级别的拦截。mNQ28资讯网——每日最新资讯28at.com

public class ControlFlowPointcut implements Pointcut, ClassFilter, MethodMatcher, Serializable {  private final Class<?> clazz;  @Nullable  private final String methodName;  // 对应类级别的匹配全部返回true,就是都匹配  @Override  public boolean matches(Class<?> clazz) {    return true;  }  // 方法匹配,直接true  @Override  public boolean matches(Method method, Class<?> targetClass) {    return true;  }  // 这里是关键,只有isRuntime返回了true才有可能调用下面3个参数的matches方法  @Override  public boolean isRuntime() {    return true;  }  // 该方法的调用需要上面2个参数的matches方法返回true且isRuntime方法也返回true才会调用这里  @Override  public boolean matches(Method method, Class<?> targetClass, Object... args) {    // 遍历当前线程的执行栈情况(也就是当前方法的调用栈情况)    for (StackTraceElement element : new Throwable().getStackTrace()) {      // 这里就开始判断当前执行的类是否与给定的类相同 && 当前设置的methodName为空或者当前栈执行的方法名与给定的方法名相同      if (element.getClassName().equals(this.clazz.getName()) &&          (this.methodName == null || element.getMethodName().equals(this.methodName))) {        // 最终这里只有返回了true,我们上面的通知MethodInterceptor才会被执行        return true;      }    }    return false;  }}

有了上面源码的分析后,我们再来看看上面的示例代码:mNQ28资讯网——每日最新资讯28at.com

// 指明要匹配的类Class<?> clazz = PersonManager.class ;// 指明要匹配的方法名String methodName = "index" ;/**  * 将传入到切入点中;而在该切入点的matches方法中进行了判断, * 整个执行的线程栈中的所有类及方法是否与这里给定的相同, * 只有相同了拦截器才能执行 */ControlFlowPointcut pointcut = new ControlFlowPointcut(clazz, methodName) ;

分析到这你应该知道这个Control Flow有撒用了吧,总结:mNQ28资讯网——每日最新资讯28at.com

Control Flow就是用来判断当前执行的线程栈中(所有方法的调用)是否与你给定的类及方法匹配,只有匹配了才能执行我们的增强(通知)代码。mNQ28资讯网——每日最新资讯28at.com

简单说:我PersonService想监控PersonManager中的index方法是否调用了我。mNQ28资讯网——每日最新资讯28at.com

官方有这段说明:mNQ28资讯网——每日最新资讯28at.com

Dynamic pointcuts are costlier to evaluate than static pointcuts. They take into account method arguments as well as static information. This means that they must be evaluated with every method invocation and that the result cannot be cached, as arguments will vary.mNQ28资讯网——每日最新资讯28at.com

The main example is the control flow pointcut.mNQ28资讯网——每日最新资讯28at.com

大意:与静态快捷方式相比,动态快捷方式的评估成本更高。它们会考虑方法参数和静态信息。这意味着每次调用方法时都必须对其进行评估,而且由于参数会发生变化,因此无法缓存评估结果。控制流快捷方式就是一个主要的例子。mNQ28资讯网——每日最新资讯28at.com

3. Control Flow性能

同样来自官方说明:mNQ28资讯网——每日最新资讯28at.com

Control flow pointcuts are significantly more expensive to evaluate at runtime than even other dynamic pointcuts. In Java 1.4, the cost is about five times that of other dynamic pointcuts.mNQ28资讯网——每日最新资讯28at.com

大意:与其他动态切入点相比,控制流切入点在运行时评估的成本要高得多。在Java1.4中,成本大约是其他动态切入点的五倍。mNQ28资讯网——每日最新资讯28at.com

mNQ28资讯网——每日最新资讯28at.com

知道了Control Flow怎么一回事,那它有什么使用场景吗?有使用过的还望能分享下图片,欢迎大家留言讨论。图片mNQ28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-39502-0.html你了解Spring AOP的这个技能点吗?有什么应用场景?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: .NET Core 3.1 升级到 .NET 8,看看都有哪些变化

下一篇: 刷了360多道算法题,我终于顿悟了它的真谛

标签:
  • 热门焦点
  • CSS单标签实现转转logo

    CSS单标签实现转转logo

    转转品牌升级后更新了全新的Logo,今天我们用纯CSS来实现转转的新Logo,为了有一定的挑战性,这里我们只使用一个标签实现,将最大化的使用CSS能力完成Logo的绘制与动画效果。新logo
  • SpringBoot中使用Cache提升接口性能详解

    SpringBoot中使用Cache提升接口性能详解

    环境:springboot2.3.12.RELEASE + JSR107 + Ehcache + JPASpring 框架从 3.1 开始,对 Spring 应用程序提供了透明式添加缓存的支持。和事务支持一样,抽象缓存允许一致地使用各
  • 从 Pulsar Client 的原理到它的监控面板

    从 Pulsar Client 的原理到它的监控面板

    背景前段时间业务团队偶尔会碰到一些 Pulsar 使用的问题,比如消息阻塞不消费了、生产者消息发送缓慢等各种问题。虽然我们有个监控页面可以根据 topic 维度查看他的发送状态,
  • 重估百度丨“晚熟”的百度云,能等到春天吗?

    重估百度丨“晚熟”的百度云,能等到春天吗?

    &copy;自象限原创作者|程心排版|王喻可2016年7月13日,百度云计算战略发布会在北京举行,宣告着百度智能云的正式启程。彼时的会场座无虚席,甚至排队排到了门外,在场的所有人几乎都
  • 慕岩炮轰抖音,百合网今何在?

    慕岩炮轰抖音,百合网今何在?

    来源:价值研究所 作者:Hernanderz&ldquo;难道就因为自己的一个产品牛逼了,从客服到总裁,都不愿意正视自己产品和运营上的问题,选择逃避了吗?&rdquo;这一番话,出自百合网联合创
  • 本地生活这块肥肉,拼多多也想吃一口

    本地生活这块肥肉,拼多多也想吃一口

    出品/壹览商业 作者/李彦编辑/木鱼拼多多也看上本地生活这块蛋糕了。近期,拼多多在App首页&ldquo;充值中心&rdquo;入口上线了本机生活界面。壹览商业发现,该界面目前主要
  • 东方甄选单飞:有些鸟注定是关不住的

    东方甄选单飞:有些鸟注定是关不住的

    文/彭宽鸿编辑/罗卿东方甄选创始人俞敏洪带队的&ldquo;7天甘肃行&rdquo;直播活动已在近日顺利收官。成立后一年多时间里,东方甄选要脱离抖音自立门户的传闻不绝于耳,&ldquo;7
  • 东方甄选单飞:有些鸟注定是关不住的

    东方甄选单飞:有些鸟注定是关不住的

    作者:彭宽鸿来源:华尔街科技眼&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;东方甄选创始人俞敏洪带队的&ldquo;7天甘肃行&rdquo;直播活动已在近日顺利收官。成立后一
  • 北京:科技教育体验基地开始登记

    北京:科技教育体验基地开始登记

      北京“科技馆之城”科技教育体验基地登记和认证工作日前启动。首批北京科技教育体验基地拟于2023年全国科普日期间挂牌,后续还将开展常态化登记。  北京科技教育体验基
Top