精通Spring Framework (4) 深入掌握Spring AOP(二)

spring aop springaop 阅读详情

二、 AspectJ 编译实现AOP

AspectJ 是静态代理的增强,所谓的静态代理就是 AOP 框架会在编译阶段生成 AOP 代理类,因此也称为编译时增强。
AspectJ 是 Java 语言的一个 AOP 实现,其主要包括两个部分:

第一个部分定义了如何表达、定义 AOP 编程中的语法规范,通过这套语言规范,我们可以方便地用 AOP 来解决 Java 语言中存在的交叉关注点问题
另一个部分是工具部分,包括编译器、调试工具等。
AspectJ 是最早、功能比较强大的 AOP 实现之一,对整套 AOP 机制都有较好的实现,很多其他语言的 AOP 实现,也借鉴或采纳了 AspectJ 中很多设计。在 Java 领域,AspectJ 中的很多语法结构基本上已成为 AOP 领域的标准。

2.1 idea 配置AspectJ

jdk 版本: 11.05
aspecj : aspectj1.9
idea 版本: 201903

虽然aspectJ 起始于eclipse 但是idea 也方便的集成了aspectJ 插件。

aspectJ 使用起来并不复杂,在编译期,织入了aop代理,编译后的代码

package com.fancv.aspectj;

import org.aspectj.runtime.internal.AroundClosure;

public class HelloWorld {
    public HelloWorld() {
    }

    public void sayHello() {
        System.out.println("Hello AspectJ");
    }

    public static void main(String[] args) {
        HelloWorld hello = new HelloWorld();
        sayHello_aroundBody1$advice(hello, TxAspect.aspectOf(), (AroundClosure)null);
    }
}
package com.fancv.aspectj;

import org.aspectj.lang.NoAspectBoundException;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.runtime.internal.AroundClosure;

@Aspect
public class TxAspect {
    static {
        try {
            ajc$postClinit();
        } catch (Throwable var1) {
            ajc$initFailureCause = var1;
        }

    }

    public TxAspect() {
    }

    @Around(
        value = "call(void HelloWorld.sayHello())",
        argNames = "ajc$aroundClosure"
    )
    public void ajc$around$com_fancv_aspectj_TxAspect$1$8852f95(AroundClosure ajc$aroundClosure) {
        System.out.println("开始事务。。。");
        ajc$around$com_fancv_aspectj_TxAspect$1$8852f95proceed(ajc$aroundClosure);
        System.out.println("结束事务。。。");
    }

    public static TxAspect aspectOf() {
        if (ajc$perSingletonInstance == null) {
            throw new NoAspectBoundException("com_fancv_aspectj_TxAspect", ajc$initFailureCause);
        } else {
            return ajc$perSingletonInstance;
        }
    }

    public static boolean hasAspect() {
        return ajc$perSingletonInstance != null;
    }
}

分析代码我们轻易可以得出一个简单的结论:aspectj 通过编译器 编译出一套实现AOP的逻辑代码,具体逻辑就不分析了。

2.2spring aop 对比 AspectJ

Spring-AOP Pros

It is simpler to use than AspectJ, since you don’t have to use LTW (load-time weaving) or the AspectJ compiler.

It uses the Proxy pattern and the Decorator pattern

Spring-AOP Cons

This is proxy-based AOP, so basically you can only use method-execution joinpoints.
Aspects aren’t applied when calling another method within the same class.
There can be a little runtime overhead.
Spring-AOP cannot add an aspect to anything that is not created by the Spring factory
AspectJ Pros

This supports all joinpoints. This means you can do anything.
There is less runtime overhead than that of Spring AOP.
AspectJ Cons

Be careful. Check if your aspects are weaved to only what you wanted to be weaved.
You need extra build process with AspectJ Compiler or have to setup LTW (load-time weaving)

Spring AOP 使用更简单,易于上手,使用了同动态代理和装饰器模式

缺点是 spring AOP 只能使用方法切点,运行时有一些开销,只能在spring factory 创建的bean 使用。

spring aop 的代理调试 困难,unreadable long stacktraces because of the proxy-based approach。

Aspects aren’t applied when calling another method within the same class.
在调用同一个类的另一个方法时,切面不生效。

这点不能理解,spring aop 切点可以是类吗?

execution是一种使用频率比较高比较主要的一种切点指示符,用来匹配方法签名,方法签名使用全限定名,包括访问修饰符(public/private/protected)、返回类型,包名、类名、方法名、参数,其中返回类型,包名,类名,方法,参数是必须的,如下面代码片段所示:

@Pointcut("execution(public String org.baeldung.dao.FooDao.findById(Long))")

上面的代码片段里的表达式精确地匹配到FooDao类里的findById(Long)方法,但是这看起来不是很灵活。假设我们要匹配FooDao类的所有方法,这些方法可能会有不同的方法名,不同的返回值,不同的参数列表,为了达到这种效果,我们可以使用通配符。如下代码片段所示:

@Pointcut("execution(* org.baeldung.dao.FooDao.*(..))")

第一个通配符匹配所有返回值类型,第二个匹配这个类里的所有方法,()括号表示参数列表,括号里的用两个点号表示匹配任意个参数,包括0个

ASpectJ 优点:支持更精细的切点,运行时开销小

缺点:学习成本,额外的编译配置。

2.3 什么时候选择AspectJ

spring 采用了动态代理实现AOP,那么在一般情况下spring AOP 完全可以满足开发需要,这里一般情况可以了简单的理解为 业界99% 的中小型项目。

如果你开发的是一个生命周期很长的项目,至少超过20年,那么可以选择使用AspectJ,根据以往的经验,框架是会改变的。(这勉强算是一个考虑点,目前spring 在国内还是很火的,目测未来10年也会持续) AspectJ 更加偏向底层实现。不受框架的影响。

spring framework 给出了Use the simplest thing that can work.
建议,除非你需要在非 spring 框架管理的Bean 使用AOP

参考资料:

  1. 《spring 实战》(第四版)
  2. idea中配置 aspect编译
  3. spring aop 动态代理原理
  4. spriing aop 获取连接点入参出参
  5. idea配置aspectJ
  6. Spring AOP 切点(pointcut)表达式
  7. Introduction to Pointcut Expressions in Spring
全面掌握Spring Framework 4.3.4及其所有jar包 本文还有配套的精品资源,点击获取 简介:Spring Framework 4.3.4是一个关键版本,属于Spring框架的4.x系列,提供了许多改进和更新。本文深入探讨了依赖注入、AOP、Spring MVC、数据访问、注解驱动开发、WebSocket支持、类型安全配置、性能优化以及兼容性和稳定性等关键知识点,并强调了这些特性在实际开发中的重要性。通过使用Spring Fr... 阅读详情

相关推荐

工业质检实战:用海康VisionMaster的BLOB分析搞定PCB焊点缺陷检测

本文详细介绍了如何利用海康VisionMaster平台的BLOB分析技术,构建一套针对PCB焊点缺陷的自动化视觉检测方案。文章从核心原理出发,重点阐述了如何通过动态阈值分割和模板匹配定位,克服工业现场光照不均、位置偏移等挑战,实现虚焊、漏焊等缺陷的精准、稳定检测,并提供了实战调优与系统集成的关键思路。

weixin_29091105的博客 560

preInstantiateSingletons()方法——(三)

Spring源码之preInstantiateSingletons()方法

qq_46144673的博客 428

数据中心机房建设标准及依据

深刻理解、尊重并恪守这些依据,是我们以科学、经济、可靠的方式,为蓬勃发展的数字经济筑牢基石的唯一路径。让我们共同努力,以标准为依据,以匠心为精神,建造更多世界一流的高效能、高可用、高智能的绿色数据中心,共同赋能数字中国的宏伟事业,支撑中华民族在数字时代的伟大复兴征程中稳步前行!今天我将力图以宏大的视角和深入的剖析,系统性地阐述数据中心机房建设所应遵循的多层次、多维度的标准依据,揭示这些依据背后的深层逻辑与时代使命,并探讨其如何共同作用于一座世界级数据中心的诞生。,以支持万兆乃至更高速率的传输。

qq_39980997的博客 1139

Spring 4 - AOP

Spring - AOP

m0_51945098的博客 649

一步一步教你写股票走势图——K线图一(概述)

股票分时图部分已经开发完毕,受到了广大开发者的好评!界面、功能都挺完美,解决了好一些MP开发者的问题,博主甚是欣悦,更有动力去开源K线图。这里说一下,如果有问题直接留言或者发邮件,github上个人信息有邮件,我看到基本都会回复,博主不加qq的,体谅O(∩_∩)O。分析好了,废话不多说,我们分析下K线图吧,首先我们看下自选股K线图的效果吧效果还是很赞的,经过分时图的研究后,博主越来越确信自选股用的应

体验Android编程之美 3万+

双轴按键摇杆模块原理与嵌入式驱动实战

双轴按键摇杆是一种融合模拟量(X/Y轴)与数字量(Z轴按键)的复合型人机交互传感器,其本质基于电位器分压原理与机械开关通断特性。通过ADC采集连续电压信号并结合数字IO检测按键状态,可实现高鲁棒性的二维运动感知与触发控制。该方案技术门槛低、成本可控、兼容性强,广泛应用于智能小车、DIY游戏手柄、工业HMI及教育开发板等嵌入式场景。文中深入解析电位器线性度、KEY引脚开漏特性、ADC参考电压稳定性及软件消抖状态机等关键工程要素,为基于Arduino、STM32或ESP32平台的快速集成提供可复用的技术路径。

weixin_30995917的博客 82

《精通Spring4.x》阅读笔记(二)- SpringAOP读这一篇就够了

基本概念 AOP(Aspect Oriented Programming): 面向切面编程,将重复性的横切性质逻辑模块化,织入到目标对象中。 产生背景 在程序设计中,会遇到一些不能通过纵向继承解决的重复代码,比如事务控制、性能监控等,这些代码并非业务逻辑所需要关注、却又不得不掺杂在业务逻辑中,造成了业务程序不够清晰、简单,并且需要重复去编写。为了解决这个问题,AOP的设计思路独辟蹊径,通过抽取...

Flash~ 609

告别WSL!实测AMD ROCm7预览版在Windows下跑ComfyUI,速度提升与避坑全记录

本文详细记录了在Windows原生环境下部署AMD ROCm7+PyTorch+ComfyUI的全流程,相比WSL环境性能显著提升。涵盖硬件兼容性确认、开发环境配置、Python环境搭建、ComfyUI部署优化及性能对比测试,为AI绘图爱好者提供实用指南。

weixin_42528090的博客 670

Spring(4)--AOP(面向切面编程)

1. Spring AOP 简介 SpringAOP 是基于 AOP 编程模式的一个框架,它的使用有效减少了系统间的重复代码,达到了模块间的耦合目的。 AOP 的全称是“Aspect Oriented Programming”,即面向切面编程,它将业务逻辑的各个部分进行隔离,使开发人员在编写业务逻辑时可以专心于核心业务,从而提高了开发效率。 程序需要------1.业务需求------需要实现程序的具体核心功能----添加用户 2.系统需求------...

wuzj1314的博客 429

手把手教你用LTspice仿真TVS二极管:从选型验证到波形分析全流程

本文详细介绍了如何使用LTspice仿真TVS二极管,从选型验证到波形分析的全流程。通过搭建仿真环境、核心参数验证和系统级防护策略,帮助工程师低成本评估TVS性能,优化电路设计。特别适用于电源设计和接口防护领域,提升工作效率和设计准确性。

weixin_29234239的博客 646

ISO15118-20证书结构关系解读(7.3.2.1)

本文主要讲述ISO15118-20:2022标准所有证书结构的关联关系,目的是为后续基于ISO15118-20车桩通讯及PNC充电等提供基础支撑。 本文所有的证书关系图全部来源于ISO15118-20:2022标准规范,在后续的讲解过程会将图的摘取出处给提供出来,便于后期文章和标准对应起来解读。

weixin_40900932的博客 3184

Spring重复扫描导致事务失败的解决方案及深入分析

问题及日志 使用Spring和mybatis,然后配置事务,出现SqlSession was not registered for synchronization because synchronization is not active,事务没有启用成功。 [org.mybatis.spring.SqlSessionUtils] - Creating a new SqlSession [...

haoyifen的专栏 2694

11、系统稳定性分析与李雅普诺夫函数的应用

本文深入探讨了李雅普诺夫函数在系统稳定性分析中的核心作用,重点介绍了时变与时不变系统的稳定性判据差异,以及巴尔巴拉特引理在处理非自治系统中的应用。文章还阐述了正线性系统与严格正实传递函数的性质及其在非线性控制系统中的重要性,并展示了李雅普诺夫函数在评估主导时间常数和设计快速干扰抑制控制策略方面的实际应用。通过具体示例和流程图,系统地总结了李雅普诺夫方法在稳定性分析、性能评估与控制器设计中的多维度价值,同时指出了当前挑战与未来发展方向。

Jerry的专栏 93

第 3 章:Spring Framework 中的 AOP

讲完了 IoC,我们再来聊聊 Spring Framework 中的另一个重要内容——面向切面编程,即 AOP。它是框架中众多功能的基础,例如声明式事务就是依靠 AOP 来实现的。此外,Spring 还为我们提供了简单的方式来使用 AOP,这有助于简化业务代码中一些共性功能的开发。本章我们会一起去了解 AOP 的基本概念,以及 AOP 在 Spring Framework 中的实现,并学习如何通过使用注解和 XML 文件的方式来配置 AOP 相关的功能。

Binge毕设 2137

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

[Spring Framework]AOP经典案例、AOP总结

概念AOP(AspectOrientedProgramming)面向切面编程,一种编程范式作用在不惊动原始设计的基础上为方法进行功能增强核心概念代理(Proxy)SpringAOP的核心本质是采用代理模式实现的连接点(JoinPoint)在SpringAOP中,理解为任意方法的执行切入点(Pointcut)匹配连接点的式子,也是具有共性功能的方法描述通知(Advice)若干个方法的共性功能,在切入点处执行,最终体现为一个方法切面(Aspect).........

十八岁讨厌编程的博客 834

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Spring AOP framework

A key component of the Spring framework is the Aspect Oriented Programming (AOP) framework. Aspect oriented programming needs to decompose program logic into different parts called so-called concerns. Functions that span multiple points of an application a

随风而逝的博客 695

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Spring Framework源码使用 spring-aspects AOP遇到的问题

在编译好的Spring Framework使用Aspects AOP 继续上一篇,编译Spring Framework5.1源码文章。现在要使用Aspects AOP也可能会遇到一些问题,现在这篇文章带你们解决这个问题。 1.导入AOP 我们先看看导入spring-aspects 这个包,然后在一个配置类打上@EnableAspectJAutoProxy这个注解会出现什么样的错误。 我们在配置一个AOP切面类,在类里面声明一个切入点,声明前置通知、后置通知、环绕通知。然后开始启动spring, 会出

linyou? 2890

Spring Framework(超详细)

Bean相关依赖相关。

2301_80744893的博客 2174

Spring FrameWork AOP

以上就是静态代理的全流程,总体来说,就是通过代理角色在不改动源代码的情况下,实现需求,并可以添加操作。这里的运行机制是通过链接InvocationHandler接口,及Proxy类实现,在了解了静态和动态代理后,就可以实现AOP面向切面编程了。例子:在执行方法前后加入语句。下面给出一个代理案例:买房。例子:实现买房动态代理。

m0_65376383的博客 846

Spring Framework AOP详解

此前对于AOP的使用仅限于声明式事务,除此之外在实际开发中也没有遇到过与之相关的问题。最近项目中遇到了以下几点需求,仔细思考之后,觉得采用AOP来解决。一方面是为了以更加灵活的方式来解决问题,另一方面是借此机会深入学习SpringAOP相关的内容。本文是权当本人的自己AOP学习笔记,以下需求不用AOP肯定也能解决,至于是否牵强附会,仁者见仁智者见智。 对部分函数的调用进行日志记录,用于观察特

cqboy1991的专栏 1025

[Spring Framework]AOP初识

Spring有两个核心的概念,一个是IOC/DI,一个是就是AOP。AOP是在不改原有代码的前提下对其进行增强。面向切面编程,一种编程范式,指导开发者如何组织程序结构。面向对象编程我们都知道OOP是一种编程思想,那么AOP也是一种编程思想,编程思想主要的内容就是指导程序员该如何编写程序,所以它们两个是不同的编程范式。AOP的作用在不惊动原始设计的基础上为其进行功能增强,前面咱们有技术就可以实现这样的功能即代理模式。名称类型配置类注解位置配置类定义上方作用开启注解格式AOP功能。......

十八岁讨厌编程的博客 658

初探Spring AOP framework

这是我对Spring AOP framework的一点点探索 - 一个class和method调用的日志拦截处理,纪录方法的调用顺序。我希望这些可以帮助你理解spring aop 并且写出你自己的拦截器。 在spring 里面用拦截器需要扩展org.aopalliance.intercept.MethodInterceptor 接口的这个方法:

leagle 3007

Spring Framework:从入门到精通的全栈开发利器

Spring Framework是Java企业级开发的核心框架,采用IoC和AOP两大核心设计理念,通过控制反转实现松耦合,利用面向切面编程处理横切关注点。Spring生态系统包含Spring Boot(简化配置)、Spring Data(统一数据访问)和Spring Security(安全解决方案)等模块,支持Web应用、微服务、批处理等场景。其设计遵循POJO优先、非侵入性和模块化原则,提供缓存、懒加载等优化手段。学习路径建议从基础概念入手,逐步掌握各模块功能,最终实现企业级应用开发。Spring以其灵

2501_93502037的博客 781

你真的了解Spring Framework吗?

现在做Java Web开发,想必很少有人不知道Spring Framework。对于初学者来讲可能只接触过其中的一两个模块,对于Spring 平台没有一个整体上的认识,核心概念IoC&DI也是一知半解。本文就与读者来一探究竟,揭开Spring 神秘的面纱。Java 框架   上世纪90年代,使用Java开发Web应用普遍使用J2EE标准,J2EE具有平台无关性,对事务、消息等企业级的特性都有很好

Just do it! 1万+

[Spring Framework]AOP配置管理②(AOP通知类型)

我们前面的案例中,出现过@Before,这个就属于通知类型。它所代表的含义是将通知添加到切入点方法执行的前面。那么我们很自然地就想到,有没有可以添加到其他位置的?AOP通知描述了抽取的共性功能,根据共性功能抽取的位置不同,最终运行代码时要将其加入到合理的位置通知具体要添加到切入点的哪里?前置通知后置通知环绕通知(重点)返回后通知(了解)抛出异常后通知(了解)前置通知,追加功能到方法执行前,类似于在代码1或者代码2添加内容后置通知返回后通知抛出异常后通知环绕通知,}}............

十八岁讨厌编程的博客 952

Spring Framework 学习笔记4:AOP

AOP(Aspect Oriented Programming,面向切面编程)是一种编程思想。它要解决的问题是:如何在不改变代码的情况下增强代码的功能。更详细的说明可以观看这个。

梦幻天空 304
上一篇: 精通Spring Framework (3) 深入掌握Spring AOP(一)
下一篇: 研发效率破局之道-学习思考
hamish-wu
博客等级 码龄15年 2814粉丝 162原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值