Spring AOP 实现原理

Spring中AOP实现原理 AOP实现原理 核心概念,使用场景 阅读详情

Spring AOP 实现原理

Spring AOP(面向切面编程)是 Spring Framework 提供的一种编程方式,它允许开发者将横切关注点(如日志、事务管理、安全性等)从业务逻辑中分离出来,从而使代码更具模块化和可维护性。Spring AOP 采用动态代理的方式,在程序运行时将切面(Aspect)织入到目标对象的代码中。

1. 切面(Aspect)

AOP 的核心,它是增强(Advice)和切点(Pointcut)的结合体。切面用于定义在哪些位置和何时应用增强。

2. 连接点(Joinpoint)

程序执行过程中的某个点,如方法调用、构造函数调用等。

3. 通知(Advice)

用于定义在连接点处执行的行为。通知可以分为多种类型,如前置通知、后置通知、异常通知等。

  • 前置通知(Before):在方法调用前执行。
  • 后置通知(After):在方法执行后执行,无论方法是否正常返回。
  • 环绕通知(Around):环绕通知可以控制目标方法是否执行,并且能够修改方法的返回值。
  • 异常通知(After Throwing):在方法抛出异常时执行。
  • 最终通知(After Returning):在方法执行完毕(正常返回)时执行。

4. 切点(Pointcut)

定义了通知应用的时机,通常通过表达式来匹配方法。

5. 代理(Proxy)

Spring AOP 通过动态代理来织入切面。代理对象充当目标对象和调用者之间的中介,在调用目标方法时,代理对象会根据切点规则执行通知。

代理方式:

  • JDK 动态代理:当目标类实现了接口时,Spring AOP 会生成一个 JDK 动态代理类来增强目标方法。
  • CGLIB 代理:当目标类没有实现接口时,Spring AOP 会使用 CGLIB 生成目标类的子类来增强方法。

6. 案例实现

假设你的目标是记录方法调用的日志

6.1 添加依赖

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>
</dependencies>

6.2 创建服务类(目标类)

创建一个简单的服务类,提供一个方法供 AOP 代理增强。

package com.example.aopdemo.service;

import org.springframework.stereotype.Service;

@Service
public class MyService {

    public String sayHello(String name) {
        return "Hello, " + name;
    }

    public int add(int a, int b) {
        return a + b;
    }
}

6.3 创建切面类

切面类包含定义通知(前置通知、后置通知、环绕通知)和切点的代码。

package com.example.aopdemo.aspect;

import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.ProceedingJoinPoint;
import org.springframework.stereotype.Component;

@Component
public class MyAspect {

    // 定义切点:对 MyService 中的所有方法进行拦截
    @Pointcut("execution(* com.example.aopdemo.service.MyService.*(..))")
    public void myServiceMethods() {}

    // 前置通知:在方法执行前调用
    @Before("myServiceMethods()")
    public void beforeMethod() {
        System.out.println("Before method execution");
    }

    // 后置通知:在方法执行后调用,无论是否抛出异常
    @After("myServiceMethods()")
    public void afterMethod() {
        System.out.println("After method execution");
    }

    // 环绕通知:控制目标方法的执行,并且可以修改返回值
    @Around("myServiceMethods()")
    public Object aroundMethod(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("Around before method execution");
        Object result = joinPoint.proceed();  // 执行目标方法
        System.out.println("Around after method execution");
        return result;
    }

    // 返回值通知:方法成功执行之后执行
    @AfterReturning(value = "myServiceMethods()", returning = "result")
    public void afterReturningMethod(Object result) {
        System.out.println("After Returning: Method executed successfully. Result = " + result);
    }
}

6.4 启动类

Spring Boot 启动类,包含主方法,加载 Spring 应用上下文并运行。

package com.example.aopdemo;

import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import com.example.aopdemo.service.MyService;

@SpringBootApplication
public class AopDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(AopDemoApplication.class, args);
    }

    @Bean
    public CommandLineRunner run(MyService myService) {
        return args -> {
            // 测试方法调用,查看 AOP 日志输出
            System.out.println(myService.sayHello("Alice"));
            System.out.println("Addition Result: " + myService.add(10, 20));
        };
    }
}

6.5 输出日志

运行应用后,你会在控制台看到如下输出:

Around before method execution
Before method execution
Hello, Alice
Around after method execution
After Returning: Method executed successfully. Result = Hello, Alice
Around before method execution
Before method execution
Addition Result: 30
Around after method execution
After Returning: Method executed successfully. Result = 30

6.6 解释

  • 前置通知(@Before):在方法执行之前执行,输出 Before method execution。
  • 后置通知(@After):在方法执行之后执行,输出 After method execution。
  • 环绕通知(@Around):能够控制目标方法的执行,可以修改返回值,输出 Around before 和 Around after。
  • 返回值通知(@AfterReturning):当方法成功执行后执行,输出 After Returning,并显示方法的返回值。

7. 总结

Spring AOP 是通过代理方式来实现的,能够在方法执行前后动态插入代码。
使用 AOP 可以帮助我们解耦横切关注点(如日志、事务管理、权限控制等),使得代码更简洁易维护。

LLaMA-Factory微调教程2:命令行sft微调 本文介绍了如何使用llama-factory项目在本地运行Qwen2-7B大语言模型进行对话。首先通过llamafactory-cli env查看环境配置,然后使用git lfs下载Qwen2-7B模型。创建配置文件qwen2_7b_instruct.yaml,修改模型路径和模板参数。最后通过llamafactory-cli chat命令启动对话服务,加载模型配置文件和tokenizer,完成环境初始化后即可进行交互式对话。 阅读详情

相关推荐

Android架构中UseCase的设计原则与实战解析

本文深入解析Android架构中UseCase的设计原则与实战应用,探讨其在Domain Layer中的核心作用。通过对比ViewModel的臃肿问题,详细阐述UseCase的无状态原则、单一职责边界等设计铁律,并提供多种实现方式的代码示例,帮助开发者构建更清晰、高效的Android应用架构。

weixin_28432777的博客 431

Spring AOP实现原理

Spring AOP 的核心是动态代理和AOP 代理工厂。1. 解析切面(Aspect) → 2. 创建代理工厂(ProxyFactory) → 3. 生成代理对象(JDK / CGLIB) → 4. 方法调用时拦截并执行切面逻辑特性Spring AOP 实现实现方式动态代理(JDK / CGLIB)代理生成时机Bean 初始化后(通知类型执行顺序按拦截器链顺序执行限制仅支持方法拦截,不支持构造器、字段代理失效场景。

红血哥 1376

以ATT&CK为例构建网络安全知识图

随着攻击工具、方法的逐渐升级和复杂化,安全数据的大规模融合,攻防对抗愈加激烈。安全团队如何在浩瀚数据中有效发现高级威胁的蛛丝马迹,如何把网络安全专家的经验、知识有效转化为可复制可扩展的数据分析能力,如何将对抗高级威胁的“炼金术”逐步升级为科学淘金指南,如何将安全从业者从繁重的体力劳动中解放出来,愈发成为安全能力亟需突破的难点和重点,也是我们正在探索的方向。正如医疗行业中治疗疑难杂症依赖医疗专家,网络空间高级威胁的防护和处置也依赖安全专家的经验与知识。

2401_88752684的博客 1090

Spring AOP的工作原理和实现方式

AOP是Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

A_aspectJ的博客 2201

基于FME—三调篇—尖锐角及小缝隙处理

1 问题分析: 该功能实现在FME较为简单,相对ARCGIS模型构建器以及ARCGIS ENGINE,FME更适合无代码基础的人群。在三调内业数据处理要求中,尖锐角是不允许存在的。本文基于FME实现了对尖锐角的自动查询与消除以及自动处理在消除尖锐角过程中产生的缝隙,并进行了拓扑检查,实现自动化批量处理尖锐角的功能,提高工作效率。 2 总体思路: 2.1 实现功能分析: 1.找出小于指定角度的尖锐角...

qq_33315579的博客 9180

iTunes登录协议全解析:从抓包到签名验证(含HTTPDebugger避坑指南)

本文深入解析了iTunes登录协议的核心流程,包括sign-sap-setup-cert和sign-sap-setup-buffer等关键请求,并提供了使用HTTPDebugger等工具进行抓包分析时绕过反调试检测的实战技巧与避坑指南。文章详细拆解了PLIST编解码、请求签名验证机制及密码加密逻辑,为网络安全研究和协议逆向提供了完整的技术路径。

weixin_29224309的博客 331

Spring AOP原理底层实现详解

Spring AOP原理底层实现详解。

大户影视的博客 1973

Python使用netmiko配置华为交换机

1.netmiko就是专门为网络设备做的模块,非常强大。1.更适合网络设备的自动化运维模块。2、批量配置变更、备份。1.安装netmiko。2. 创建SSH连接。一、netmiko介绍。

博然的宝藏库 2795

Spring AOP的实现原理

Spring AOP的底层实现原理及详细介绍以及适配器和常用通知的使用

weixin_74268571的博客 3757

计算机组成原理汉字编码与校验设计实验报告(汉字国标码转区位码实验、汉字机内码获取实验、海明编码电路设计与海明解码)

这次实验利用logisim进行设计,进行了以下这四个实验,其中分为汉字国标码转区位码实验、汉字机内码获取实验、海明编码电路设计与海明解码,实验报告分为四个部分,在这四个部分中依次对四个实验的方案设计,设计思路进行了介绍

zhang2gongzi的博客 6万+

Experion PKS系列开发:I_O模块_ExperionPKS与第三方I-O模块的集成

通过上述步骤,可以成功将第三方I/O模块集成到Honeywell Experion PKS系统中,实现对现场设备的监视和控制。集成过程中需要注意选择合适的第三方模块,配置正确的通信参数,编写正确的控制逻辑,并进行充分的测试,以确保系统的稳定性和可靠性。不同的通信协议(如Modbus、Profibus、Ethernet/IP、CANopen、OPC UA)有其独特的配置和编程方法,但总体流程相似。在实际应用中,根据项目需求选择合适的协议和模块,可以有效提高系统的灵活性和适应性。

zhubeibei168的博客 1099

Spring的AOP实现原理

客户端代码 -> 调用被代理Bean的方法 -> 实际调用的是动态生成的代理对象 (JDK Proxy或CGLIB子类) -> 代理对象查找匹配该方法的通知链 -> 创建MethodInvocation包装本次调用 -> 驱动MethodInvocation.proceed() -> 按顺序执行拦截器链中的 MethodInterceptor (对应各种通知) -> 最终在链中调用原始目标对象的方法 -> 结果/异常沿链返回 -> 代理对象将结果返回给客户端。​:AOP 联盟定义的拦截器接口。

YangChingyuk的博客 872

A133在Android13上适配百兆以太网

NOTE] 【技术支持问题】问题背景/平台。

mangofu的博客 412

Spring AOP 的实现及原理

spring aop 的实现及原理

qq_71360748的博客 929

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Spring AOP实现原理简介

AOP联盟标准AOP联盟将AOP体系分为三层,从三层结构可以看出,AOP实现方式有很多种,包括反射、元数据处理、程序处理、拦截器处理等,通过本节学习,你就会看到Spring AOP的实现使用的是Java语言本身的特性,即Java Proxy代理类、拦截器技术实现。AOP简介概念切面(Aspect) :官方的抽象定义为“一个关注点的模块化,这个关注点可能会横切多个对象”。连接点(Joinpoint)...

wyl6019的博客 7万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Spring AOP ① 实现原理

AOP的实现原理分3个阶段收集切面生成代理使用代理对象。

weixin_37711738的博客 1269

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

spring中AOP实现的原理

AOP:全称是Aspect Oriented Programming即:面向切面编程。通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。简单的说:它就是把我们程序中重复的代码抽取出来,在需要执行的时候,使用动态代理的技术,在不修改源码的基础上,对我们的已有的方法的增强。

haha_66666的博客 353

Spring aop的实现原理

简介   前段时间写的java设计模式--代理模式,最近在看Spring Aop的时候,觉得于代理模式应该有密切的联系,于是决定了解下Spring Aop的实现原理。   说起AOP就不得不说下OOP了,OOP中引入封装、继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合。但是,如果我们需要为部分对象引入公共部分的时候,OOP就会引入大量重复的代码。例如:日志功能。   AO...

一起进步的博客 278

spring AOP的实现原理

Spring aop的实现原理 简介   前段时间写的java设计模式–代理模式,最近在看Spring Aop的时候,觉得于代理模式应该有密切的联系,于是决定了解下Spring Aop的实现原理。 说起AOP就不得不说下OOP了,OOP中引入封装、继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合。但是,如果我们需要为部分对象引入公共部分的时候,OOP就会引入大量重复的代码。例如...

qq_43757153的博客 447

Spring AOP 的实现原理是什么?

特性JDK 动态代理CGLIB 代理核心技术Java 反射 (字节码增强 (Bytecode Enhancement)代理方式实现目标对象的所有接口继承目标对象,创建其子类前提条件目标对象必须实现接口目标对象不能是 final 类,方法不能是 finalSpring Boot 默认否是 (推荐)对代码影响无无理解 Spring AOP 是基于运行时动态代理这一核心原理,以及它与目标对象和代理对象的关系,是掌握 AOP 并解决类似“方法内部调用导致 AOP 失效”等问题的关键。

专注于技术分享 819

Spring进阶 - Spring AOP实现原理详解之AOP切面的实现

由IOC Bean加载方法栈中找到parseCustomElement方法,找到parse aop:aspectj-autoproxy的handler(org.springframework.aop.config.AopNamespaceHandler)AopNamespaceHandler注册了的解析类是AspectJAutoProxyBeanDefinitionParser。

珍惜当下 1034

spring AOP 实现原理模拟实现

接着上篇spring IOC ,测试代码链接请到上篇文章找。 利用Java的反射与代理实现AOP 一.AOP概述       AOP(Aspect Oriented Programing),即面向切面编程,它主要用于日志记录、性能统计、安全控制、事务处理、异常处理等方面。它的主要意图就要将日志记录,性能统计,安全控制、事务处理、异常处理等等代码从业务逻辑代码中清楚地划分出来。通

丁辉-blog 2153
上一篇: Spring Boot Actuator 详细介绍
下一篇: ShardingSphere-JDBC 和 ShardingSphere-Proxy区别
冰糖心书房
博客等级 码龄15年 6014粉丝 690原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰糖心书房

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值