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

涨知识!Spring AOP还能这么玩,看看你的项目能否用上

来源: 责编: 时间:2024-01-02 09:31:49 289观看
导读环境:Spring5.3.23本篇文章将介绍两个主题:控制流切入点(动态切入点)引介通知
1. 简介Spring AOP是Spring框架的一个重要组成部分,它允许开发者定义跨多个模块的横切关注点,例如日志记录、事务管理、安全等。控制流切入和引

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

本篇文章将介绍两个主题:7sw28资讯网——每日最新资讯28at.com

  • 控制流切入点(动态切入点)
  • 引介通知

1. 简介

Spring AOP是Spring框架的一个重要组成部分,它允许开发者定义跨多个模块的横切关注点,例如日志记录、事务管理、安全等。控制流切入和引介通知是Spring AOP中的两个关键特性,它们能够增强程序的可维护性和可读性。本文将深入探讨这两个特性的工作原理和使用方法。7sw28资讯网——每日最新资讯28at.com

控制流切入

控制流切入允许我们根据方法调用的控制流来定义切入点。控制流切入点与当前调用堆栈匹配。例如,如果连接点被com.pack.service包中的方法或PersonService类调用,它可能会触发。控制流切入点是通过使用org.springframework.aop.support.ControlFlowPointcut类指定的。7sw28资讯网——每日最新资讯28at.com

引介通知

引介通知能够声明被建议的对象实现给定的接口,并代表这些对象提供该接口的实现。简单说:你有个PersonService类,引介通知能够让你不修改代码的情况下去实现你给定的任意接口(CommonDAO)。7sw28资讯网——每日最新资讯28at.com

2. 实战案例

2.1 控制流切入点

准备基础类

@Componentpublic class PersonDAO {  public void save(String name) {    System.out.println("PersonDAO save method invoke...") ;  }}@Componentpublic class PersonService {  @Resource  private PersonDAO dao ;  public void save(String name) {    System.out.println("PersonService save method inovke...") ;    this.dao.save(name) ;  }}

定义切面类Advisor

低级切面Advisor,平时使用的@Aspect算是高级切面类,而这些高级切面类最终会被转换为Advisor低级切面类。7sw28资讯网——每日最新资讯28at.com

@Componentpublic class PackControlFlowAdvisor extends DefaultPointcutAdvisor {  private static MethodInterceptor logInterceptor = invocation -> {    System.out.println("before log...") ;    Object ret = invocation.proceed() ;    System.out.println("after log...") ;    return ret ;  } ;  // 要进行匹配的类  private static Class<?> clazz = PersonService.class ;  // 要进行匹配的方法(可以为null,这样指定类中的所有方法都会被匹配拦截)  private static String methodName = "save" ;  private static ControlFlowPointcut pointcut = new ControlFlowPointcut(clazz, methodName) ;  public PackControlFlowAdvisor() {    super(pointcut, logInterceptor) ;  }}

测试7sw28资讯网——每日最新资讯28at.com

PersonService ps = context.getBean(PersonService.class) ;ps.save("王五") ;

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

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

PersonDAO中的save方法被拦截了。什么意思?怎么PersonDAO就被拦截了,先来看上面切点的定义ControlFlowPointcut7sw28资讯网——每日最新资讯28at.com

public class ControlFlowPointcut implements Pointcut, ClassFilter, MethodMatcher {  public boolean matches(Class<?> clazz) {    return true;  }  public boolean matches(Method method, Class<?> targetClass) {    return true;  }  public boolean isRuntime() {    return true;  }  public boolean matches(Method method, Class<?> targetClass, Object... args) {    // 取得当前线程的整个执行栈(方法的调用)    for (StackTraceElement element : new Throwable().getStackTrace()) {      if (element.getClassName().equals(this.clazz.getName()) &&          (this.methodName == null || element.getMethodName().equals(this.methodName))) {        return true;      }    }    return false;  }}

通过在这个切点类能知道:7sw28资讯网——每日最新资讯28at.com

  1. 当前容器中的所有类都会被代理;因为这里的类匹配直接返回true,2个参数的matches直接返回true,最后isRuntime返回true,最终执行3个参数的matches方法。
  2. 每个类中方法的调用都会获取当前执行的栈,都会进行判断类及方法是否被匹配。

结合上面的测试输出结果,PersonDAO#save方法被拦截了,因为它符合匹配条件,在PersonService#save方法中调用了PersonDAO#save方法,那PersonDAO#save方法执行栈中就包含了PersonService#save正好匹配了我们定义的切点。7sw28资讯网——每日最新资讯28at.com

简单说:某个类中的某个方法调用时会判断当前整个执行栈中是否有设定好的类及方法,如果有则拦截当前的方法(执行通知)。
7sw28资讯网——每日最新资讯28at.com

注意:控制流切入点比正常切入点慢10-15倍,但在某些情况下它们是有用的。所以大家还是慎重使用吧,毕竟所有的类都被代理了(当然这里我们可以自定义matches来控制)。7sw28资讯网——每日最新资讯28at.com

2.2 引介通知

引介通知相对比较简单直接可以在@Aspect切面类中定义7sw28资讯网——每日最新资讯28at.com

注备基础类

// 这个接口是我们准备让其它类实现的public interface CommonManager {  void calc(int a, int b) ;}// 默认实现public class DefaultCommonManager implements CommonManager {  @Override  public void calc(int a, int b) {    System.out.printf("计算a + b = %d%n", (a + b)) ;  }}// 该类是我们将要通过引介增强让其实现CommonManager类@Component("us")public class UserService {  public void save() {    System.out.println("UserService save...") ;  }}

切面类7sw28资讯网——每日最新资讯28at.com

@Aspectpublic static class CommonAspect {  /**   * 这样声明后,匹配的类就会自动的实现这里指定的CommonManager接口,默认的实现类是使用DefaultCommonManager   * value:该值决定了哪些类会被增强(实现指定的CommonManager接口)   */  @DeclareParents(value = "com.pack.main.aop_introductionadviser.IntructionDeclareMain2.*+", defaultImpl = DefaultCommonManager.class)  public static CommonManager mixin;}

注意:在这个切面类中我们并没有定义@Before,@Around等同志。7sw28资讯网——每日最新资讯28at.com

测试
7sw28资讯网——每日最新资讯28at.com

CommonManager c = (CommonManager) context.getBean("us") ;c.calc(10, 20) ;

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

计算a + b = 30

UserService能正确的转换为CommonManager类,这说明UserService生成的代理类实现了CommonManager接口类,同时在执行方法调用的时候使用的是我们制定的默认实现类DefaultCommonManager。7sw28资讯网——每日最新资讯28at.com

总结:控制流切入点(ControlFlowPointcut)和引介通知(@DeclareParents)是Spring AOP的两个重要概念。控制流切入点用于在特定的控制流条件下切入代码,而引介通知则让目标类具有更加强大的能力。7sw28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-55298-0.html涨知识!Spring AOP还能这么玩,看看你的项目能否用上

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

上一篇: 涨知识!Spring AOP还能这么玩,看看你的项目能否用上

下一篇: 微服务架构下分布式事务处理方案选择和对比

标签:
  • 热门焦点
  • 小米官宣:2023年上半年出货量中国第一!

    今日早间,小米电视官方微博带来消息,称2023年小米电视上半年出货量达到了中国第一,同时还表示小米电视的巨屏风暴即将开始。“公布一个好消息2023年#小米电视上半年出货量中国
  • 8月总票房已突破10亿!《封神》第一:口碑已经成了

    8月5日消息,据灯塔专业版数据,截至8月5日9时35分,8月总票房(含预售)已突破10亿。其中,《封神》以大比分的优势领先。根据官方消息,目前该片总票房已经超过14.
  • 量化指标是与非:挽救被量化指标扼杀的技术团队

    作者 | 刘新翠整理 | 徐杰承本文整理自快狗打车技术总监刘新翠在WOT2023大会上的主题分享,更多精彩内容及现场PPT,请关注51CTO技术栈公众号,发消息【WOT2023PPT】即可直接领取
  • 雅柏威士忌多款单品价格大跌,泥煤顶流也不香了?

    来源 | 烈酒商业观察编 | 肖海林今年以来,威士忌市场开始出现了降温迹象,越来越多不断暴涨的网红威士忌也开始悄然回归市场理性。近日,LVMH集团旗下苏格兰威士忌品牌雅柏(Ardbeg
  • Temu起诉SHEIN,跨境电商战事升级

    来源 | 伯虎财经(bohuFN)作者 | 陈平安日前据外媒报道,拼多多旗下跨境电商平台Temu正对竞争对手SHEIN提起新诉讼,诉状称Shein&ldquo;利用市场支配力量强迫服装厂商与之签订独家
  • 一条抖音4亿人围观 ! 这家MCN比无忧传媒还野

    作者:Hiu 来源:互联网品牌官01 擦边少女空降热搜,幕后推手曝光被网友誉为&ldquo;纯欲天花板&rdquo;的女网红井川里予,近期因为一组哥特风照片登上热搜,引发了一场互联网世界关于
  • 2纳米决战2025

    集微网报道 从三强争霸到四雄逐鹿,2nm的厮杀声已然隐约传来。无论是老牌劲旅台积电、三星,还是誓言重回先进制程领先地位的英特尔,甚至初成立不久的新
  • 首发天玑9200+ iQOO Neo8系列发布首销售价2299元起

    2023年5月23日晚,iQOO Neo8系列正式发布。其中,Neo系列首款Pro之作——iQOO Neo8 Pro强悍登场,限时售价3099元起;价位段最强性能手机iQOO Neo8同期上市
  • DRAM存储器10月价格下跌,NAND闪存本月价格与上月持平

    10月30日,据韩国媒体消息,自今年年初以来一直在上涨的 DRAM 存储器的交易价格仅在本月就下跌了近 10%,此次是全年首次降价,而NAND 闪存本月价格与上月持平。市
Top