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

强大!SpringBoot通过三种方式实现AOP切面,第三种方式性能极佳

来源: 责编: 时间:2024-07-09 07:03:31 728观看
导读环境:SpringBoot2.7.181. 简介Spring框架通过多种机制增强代码功能,实现切面编程(AOP)。核心之一是通过动态代理技术,在运行时为Bean织入(动态代理)额外功能(如日志、安全等),无需修改源代码。此外,利用Java Agent技术(如AspectJ

环境:SpringBoot2.7.182yL28资讯网——每日最新资讯28at.com

1. 简介

Spring框架通过多种机制增强代码功能,实现切面编程(AOP)。核心之一是通过动态代理技术,在运行时为Bean织入(动态代理)额外功能(如日志、安全等),无需修改源代码。此外,利用Java Agent技术(如AspectJ Weaver),可以在JVM层面拦截类加载过程,动态修改类字节码,从而实现更广泛的AOP支持。最后,AspectJ-Maven-Plugin编译插件在编译时直接修改源代码或字节码,确保切面逻辑与业务代码无缝集成,优化了性能并减少了运行时开销。这些技术使得开发者能更灵活地管理横切关注点,提升代码模块性和可维护性。接下来我们将详细的介绍这3种AOP实现的方式。2yL28资讯网——每日最新资讯28at.com

2. 实战案例

2.1 准备环境

Service类

@Servicepublic class UserService {    public void save() {    System.out.println("save...") ;  }}

接下来的所有示例都将围绕着上面这个Service。2yL28资讯网——每日最新资讯28at.com

运行测试类

SpringApplication app = new SpringApplication(AppApplication.class) ;app.setWebApplicationType(WebApplicationType.NONE) ;ConfigurableApplicationContext context = app.run(args) ;UserService us = context.getBean(UserService.class) ;us.save() ;

启动测试类2yL28资讯网——每日最新资讯28at.com

2.2 代理方式

该种方式,是我们工作中用的最为普遍的方式,因为该种方式灵活,无需修改代码,适用于运行时切面增强,易于理解和集成。如下示例:2yL28资讯网——每日最新资讯28at.com

定义切面

@Component@Aspectpublic class LogAspect {    @Pointcut("execution(* com.pack..*Service.*(..))")  private void log() {}    @Before("log()")  public void before(JoinPoint jp) {    System.out.println("before, " + jp.getSignature()) ;  }}

动态代理方式,只需要定义上面的切面Bean类。2yL28资讯网——每日最新资讯28at.com

运行测试代码,输出结果

before, void com.pack.aop.agent.UserService.save()save...

通过动态代理方式,只需要在项目中定义@Aspect切面即可完成增强逻辑。我们将获取的UserService Class打印如下:2yL28资讯网——每日最新资讯28at.com

图片图片2yL28资讯网——每日最新资讯28at.com

通过CGLIB生成了代理类。2yL28资讯网——每日最新资讯28at.com

2.3 Agent增强方式

该种方式是在JVM层面拦截,支持更广泛的AOP场景,性能优化潜力大(相比较于上面代理方式)。要实现这种方式,我们首先需要定义aop.xml文件(META-INF中)2yL28资讯网——每日最新资讯28at.com

<aspectj>  <weaver>    <!-- 对哪些类进行增强 -->    <include within="com.pack.aop.agent..*" />  </weaver>  <!-- 定义切面类,可以定义多个 -->  <aspects>    <aspect name="com.pack.aop.agent.LogAspect" />  </aspects></aspectj>

接下来就运行时还需要配置jvm运行时参数2yL28资讯网——每日最新资讯28at.com

-javaagent:d:/maven/org/aspectj/aspectjweaver/1.9.7/aspectjweaver-1.9.7.jar

注:这里的版本最后根据你当前环境的版本来指定。2yL28资讯网——每日最新资讯28at.com

运行测试代码:2yL28资讯网——每日最新资讯28at.com

图片图片2yL28资讯网——每日最新资讯28at.com

我们的业务代码被增强了,同时UserService并没有创建代理。通过反编译查看UserService。2yL28资讯网——每日最新资讯28at.com

图片图片2yL28资讯网——每日最新资讯28at.com

编译后的字节码也没有任何的变化。Agent的原理就在进行类加载时对类进行增强。2yL28资讯网——每日最新资讯28at.com

2.4 编译插件方式

动态代理的方式,通过对目标类生成代理,在执行目标方法前执行增强逻辑Advice,这种方式多少对性能是有影响的。而编译插件方式是在编译时增强,性能最佳,深度集成,减少运行时开销。2yL28资讯网——每日最新资讯28at.com

添加maven插件

<plugin>  <groupId>org.codehaus.mojo</groupId>  <artifactId>aspectj-maven-plugin</artifactId>  <version>1.11</version>  <configuration>      <complianceLevel>1.8</complianceLevel>      <source>1.8</source>      <target>1.8</target>      <showWeaveInfo>true</showWeaveInfo>    <Xlint>ignore</Xlint>      <encoding>UTF-8</encoding>      <skip>true</skip>  </configuration>  <executions>      <execution>          <configuration>              <skip>false</skip>          </configuration>          <goals>              <goal>compile</goal>          </goals>      </execution>  </executions></plugin>

接下来我们可以将LogAspect类上的@Component注解删除了,现在不需要了。重新编译项目2yL28资讯网——每日最新资讯28at.com

mvn clean compile

再次运行测试代码;2yL28资讯网——每日最新资讯28at.com

图片图片2yL28资讯网——每日最新资讯28at.com

我们的代码同样被增强了,同时打印了UserService类,该类并没有被代理。反编译该类。2yL28资讯网——每日最新资讯28at.com

图片图片2yL28资讯网——每日最新资讯28at.com

通过反编译得知,在编译阶段就对我们的代码进行了增强。这也是此种方式性能最佳的原因。2yL28资讯网——每日最新资讯28at.com

总结:以上三种方式增强代码:动态代理灵活轻量,运行时织入;Java Agent在JVM层面拦截类加载,支持广泛AOP场景,性能优化潜力大但配置相对复杂;AspectJ-Maven-Plugin编译时修改字节码,减少运行时开销,支持复杂逻辑但需重新编译。2yL28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-99647-0.html强大!SpringBoot通过三种方式实现AOP切面,第三种方式性能极佳

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

上一篇: 我让代码,学会了自动评审!提高80%的交付质量!

下一篇: 浅谈Node.js核心组件

标签:
  • 热门焦点
  • 一加Ace2 Pro真机揭晓 钛空灰配色质感拉满

    一加Ace2 Pro真机揭晓 钛空灰配色质感拉满

    终于,在经过了几波预热之后,一加Ace2 Pro的外观真机图在网上出现了。还是博主数码闲聊站曝光的,这次的外观设计还是延续了一加11的方案,只是细节上有了调整,例如新加入了钛空灰
  • Redmi Pad评测:红米充满野心的一次尝试

    Redmi Pad评测:红米充满野心的一次尝试

    从Note系列到K系列,从蓝牙耳机到笔记本电脑,红米不知不觉之间也已经形成了自己颇有竞争力的产品体系,在中端和次旗舰市场上甚至要比小米新机的表现来得更好,正所谓“大丈夫生居
  • 0糖0卡0脂 旭日森林仙草乌龙茶优惠:15瓶到手29元

    0糖0卡0脂 旭日森林仙草乌龙茶优惠:15瓶到手29元

    旭日森林无糖仙草乌龙茶510ml*15瓶平时要卖为79.9元,今日下单领取50元优惠券,到手价为29.9元。产品规格:0糖0卡0脂,添加草本仙草汁,清凉爽口,富含茶多酚,保留
  • 如何使用JavaScript创建一只图像放大镜?

    如何使用JavaScript创建一只图像放大镜?

    译者 | 布加迪审校 | 重楼如果您曾经浏览过购物网站,可能遇到过图像放大功能。它可以让您放大图像的特定区域,以便浏览。结合这个小小的重要功能可以大大改善您网站的用户体验
  • 虚拟键盘 API 的妙用

    虚拟键盘 API 的妙用

    你是否在遇到过这样的问题:移动设备上有一个固定元素,当激活虚拟键盘时,该元素被隐藏在了键盘下方?多年来,这一直是 Web 上的默认行为,在本文中,我们将探讨这个问题、为什么会发生
  • 每天一道面试题-CPU伪共享

    每天一道面试题-CPU伪共享

    前言:了不起:又到了每天一到面试题的时候了!学弟,最近学习的怎么样啊 了不起学弟:最近学习的还不错,每天都在学习,每天都在进步! 了不起:那你最近学习的什么呢? 了不起学弟:最近在学习C
  • 三星获批量产iPhone 15全系屏幕:苹果史上最惊艳直屏

    三星获批量产iPhone 15全系屏幕:苹果史上最惊艳直屏

    按照惯例,苹果将继续在今年9月举办一年一度的秋季新品发布会,有传言称发布会将于9月12日举行,届时全新的iPhone 15系列将正式与大家见面,不出意外的话
  • 荣耀Magicbook V 14 2021曙光蓝版本正式开售,拥有触摸屏

    荣耀Magicbook V 14 2021曙光蓝版本正式开售,拥有触摸屏

    荣耀 Magicbook V 14 2021 曙光蓝版本正式开售,搭载 i7-11390H 处理器与 MX450 显卡,配备 16GB 内存与 512GB SSD,重 1.48kg,厚 14.5mm,具有 1.5mm 键盘键程、
  • 联想小新Pad Pro 12.6将要推出,搭载高通骁龙 870 处理器

    联想小新Pad Pro 12.6将要推出,搭载高通骁龙 870 处理器

    联想小新Pad Pro 12.6将于秋季新品会上推出,官方按照惯例直接在发布会前给出了机型的所有参数。联想小新 Pad Pro 12.6 将搭载高通骁龙 870 处理器,重量为 5
Top