springboot aop详解

news2024/11/20 11:39:22

springboot aop的实现方式有哪些

在 Spring Boot 中,AOP(面向切面编程)是通过 Spring Framework 提供的 AOP 模块来实现的。Spring AOP 提供了几种实现方式来应用切面编程,包括以下几种:

  1. 基于代理的 AOP: 这是 Spring AOP 的默认实现方式。它基于代理对象来实现切面编程,使用 JDK 动态代理或 CGLIB 动态代理来创建代理对象,并将切面逻辑织入到代理对象中。

  2. 基于切面的 AOP: 基于切面的 AOP 是通过 AspectJ 框架来实现的,它提供了更强大和灵活的切面功能,可以实现更细粒度的切面控制和更复杂的切面逻辑。

在 Spring Boot 中,默认情况下会使用基于代理的 AOP 来实现切面编程,根据目标对象是否实现接口的情况,选择使用 JDK 动态代理或 CGLIB 动态代理。Spring Boot 也提供了一些自定义配置选项,可以根据需要选择合适的 AOP 实现方式。

另外,如果需要更高级、更复杂的切面编程功能,也可以选择使用 AspectJ 框架,并与 Spring Boot 集成。AspectJ 提供了更灵活、更强大的切面编程能力,但相应地也增加了复杂性和学习曲线。

springboot判断使用哪种代理的源码

Spring Boot 在选择使用哪种代理的过程中,实际上是借助了 Spring Framework 的 AOP 模块来进行判断和选择的。Spring AOP 提供了相应的逻辑来确定使用 JDK 动态代理还是 CGLIB 动态代理。

具体来说,Spring AOP 的逻辑是基于目标类是否实现了接口来选择使用哪种代理。以下是 Spring AOP 选择代理的源码逻辑:

  1. 如果目标类实现了接口,Spring AOP 将会使用 JDK 动态代理。这是因为 JDK 动态代理要求目标类实现接口,因此它只能代理接口,无法代理类。

  2. 如果目标类没有实现接口,Spring AOP 将会尝试使用 CGLIB 动态代理。CGLIB 动态代理可以代理没有实现接口的类,通过生成目标类的子类来实现代理。

@Override
	public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException {
	    //如果配置了代理,且用户未提供代理自定义代理接口
		if (!NativeDetector.inNativeImage() &&
				(config.isOptimize() || config.isProxyTargetClass() || hasNoUserSuppliedProxyInterfaces(config))) {
			Class<?> targetClass = config.getTargetClass();
			if (targetClass == null) {
				throw new AopConfigException("TargetSource cannot determine target class: " +
						"Either an interface or a target is required for proxy creation.");
			}
			//如果目标类实现了接口,Spring AOP 将会使用 JDK 动态代理
			if (targetClass.isInterface() || Proxy.isProxyClass(targetClass)) {
				return new JdkDynamicAopProxy(config);
			}
			//否则使用cglib
			return new ObjenesisCglibAopProxy(config);
		}
		else {
			return new JdkDynamicAopProxy(config);
		}
	}

在 Spring AOP 中,这个逻辑主要体现在 AdvisedSupport 类和 ProxyFactory 类中。这两个类分别负责对代理逻辑的处理和代理对象的创建。在实际使用过程中,可以通过调试这些类的源码来更深入地了解 Spring AOP 是如何选择代理的。

在这里插入图片描述

代理对象的创建过程

ProxyFactoryBean是Spring框架提供的一个工厂bean,用于创建代理对象。它可以用来为目标对象创建动态代理,以实现AOP(面向切面编程)的功能。

ProxyFactoryBean的主要作用是将目标对象包装在一个代理对象中,并在代理对象的方法执行前后插入额外的逻辑。这些额外的逻辑可以是事务管理、日志记录、性能监控等。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1094762.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CSS变量 var()的用法

写在前面 这里介绍一下开发中常用的css变量var()&#xff0c;它可以实现样式的动态设置&#xff0c;使用方法主要分为全局使用和局部使用两种。 如何定义CSS变量var() 在CSS文件中&#xff0c;变量需要使用 – 作为前缀来定义&#xff0c;后面跟上变量名和值&#xff0c;如&a…

基于人工电场优化的BP神经网络(分类应用) - 附代码

基于人工电场优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于人工电场优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.人工电场优化BP神经网络3.1 BP神经网络参数设置3.2 人工电场算法应用 4.测试结果…

ARM +FPGA GPIB IP核实现

目前在数据发生其技术上居领先的是美国的 Tektronix 公司和 Agilent 公司。 Agilent 公司的台式脉冲 / 数据发生器家族的最高时钟频率达 3GHz &#xff08;定 时发生器&#xff09;&#xff0c;数据发生器 E81200 在通道数为 8CH 时数据速率为 660Mb/s, 即可以产…

22python生命周期的一种案例

第一个问题&#xff0c;什么叫生命周期&#xff1f; 生命周期就是一个对象从产生到消亡的一个周期过程&#xff0c;总体来说是一个这样的 展示一下生命周期的一点点的小案例吧~ 1、利用全局变量 #以下是一个python展示生命周期的方法过程 personCount 0 class Person:def _…

月薪过二万的Java面试

文章目录 &#x1f4d5;我是廖志伟&#xff0c;一名Java开发工程师、Java领域优质创作者、CSDN博客专家、51CTO专家博主、阿里云专家博主、清华大学出版社签约作者、产品软文创造者、技术文章评审老师、问卷调查设计师、个人社区创始人、开源项目贡献者。&#x1f30e;跑过十五…

创新YOLOv5改进:结合全新可变形大核注意力(D-LKA Attention)实现多尺度目标涨点

🔥🔥🔥 提升多尺度目标检测,创新提升 🔥🔥🔥 🔥🔥🔥 捕捉图像特征和处理复杂图像特征 🔥🔥🔥 👉👉👉: 本专栏包含大量的新设计的创新想法,包含详细的代码和说明,具备有效的创新组合,可以有效应用到改进创新当中 👉👉👉: 🐤🐤�…

Java并发面试题:(一)线程的5种状态及转换

线程的状态转换 1、新建状态&#xff08;New&#xff09;&#xff1a;新创建了一个线程对象。 2、就绪状态&#xff08;Runnable&#xff09;&#xff1a;线程对象创建后&#xff0c;其他线程调用了该对象的start()方法。该状态的线程位 于可运行线程池中&#xff0c;变得可运…

设计模式(1)-设计模式前置基础知识

1&#xff0c;设计模式概述 1.1 软件设计模式的产生背景 "设计模式"最初并不是出现在软件设计中&#xff0c;而是被用于建筑领域的设计中。 1977年美国著名建筑大师、加利福尼亚大学伯克利分校环境结构中心主任克里斯托夫亚历山大&#xff08;Christopher Alexand…

三大方法快速发现商业规律

文章目录 三大方法快速发现商业规律一、市场调研二、数据分析三、案例分析 &#x1f4d5;我是廖志伟&#xff0c;一名Java开发工程师、Java领域优质创作者、CSDN博客专家、51CTO专家博主、阿里云专家博主、清华大学出版社签约作者、产品软文创造者、技术文章评审老师、问卷调查…

新时代高效记账:自动化智能如何进行财务管理

随着科技的不断发展&#xff0c;自动化智能已经逐渐渗透到我们生活的各个领域。在财务管理中&#xff0c;自动化智能的应用显得尤为重要。它不仅可以提高财务管理的效率和精度&#xff0c;还能帮助我们更好地规划和掌控公司的财务状况 晨曦记账本提供了多种高效财务管理工具。…

【linux kernel】对linux内核设备的注册机制和查找机制分析

文章目录 1、简介2、device_initialize分析3、device_add分析4、总结 &#x1f53a;【linux内核系列文章】 &#x1f449;对一些文章内容进行了勘误&#xff0c;本系列文章长期不定时更新&#xff0c;希望能分享出优质的文章&#xff01; 1、《linux内核数据结构分析之哈希表》…

冲刺十五届蓝桥杯P0006平面切分

文章目录 题目思路代码总结 题目 平面切分 思路 这道题是一个思维题把&#xff0c;之前没有接触过平面几何的知识&#xff0c;做起来感觉还是比较难的&#xff0c;用到的set集合和自己创建一个类 首先我们知道&#xff0c;一根直线A是可以将平面切分成两块的&#xff0c;如…

如何能优化网站开展速度

随着互联网技术的飞速发展&#xff0c;网站加载速度已经成为一个不可忽视的关键要素。 当您的网站速度缓慢&#xff0c;不仅会影响用户的访问体验&#xff0c;还可能导致用户的流失。以下是一些创新的技巧和策略&#xff0c;帮助您提升网站打开速度。 一、在图像压缩上做文章 …

ArcGIS JS API 演示Demo

ArcGIS JS API Demo演示地址 https://ralucanicola.github.io/JSAPI_demos/ ArcGIS JS API Demo下载地址 https://github.com/RalucaNicola/JSAPI_demos

PyTorch入门教学——使用PyCharm创建一个PyTorch项目

首先需要创建好PyTorch的虚拟环境&#xff0c;步骤&#xff1a;PyTorch入门教学——简介与环境配置-CSDN博客打开PyCharm&#xff0c;新建项目&#xff0c;选择项目的存放位置。选择先前配置的解释器&#xff0c;也就是虚拟环境中的解释器。&#xff08;记住创建的虚拟环境所在…

1、资源包下载

1 、百度云盘永久下载地址 : 链接&#xff1a; https://pan.baidu.com/s/13pBco75qXU6bLxlTtZ29TQ 提取码&#xff1a; ixkg 2 、官方下载地址&#xff1a; https://dev.mysql.com/downloads/mysql/ 3 、注意&#xff1a;下载时候要选择自己的系统和对应的电脑 CPU 位数&a…

Multisim14 逻辑分析仪的使用教程(打开关闭+详细具体)

一、打开逻辑分析仪 总结&#xff1a;根据自身的分析需要选择分析的参数&#xff0c;保存并允许结果。然后根据参数的设置&#xff0c;看运行结果是否满足项目分析需要。 二、 关闭逻辑分析仪 最后&#xff0c;再次运行即可关闭逻辑分析仪了&#xff01; 总结&#xff1a;如果…

LLM 系列 | 21 : Code Llama实战(上篇) : 模型简介与评测

引言 小伙伴们好&#xff0c;我是《小窗幽记机器学习》的小编&#xff1a;卖热干面的小女孩。 个人CSDN首页&#xff1a;JasonLiu1919_面向对象的程序设计,深度学习,C-CSDN博客 今天开始以2篇小作文介绍代码大语言模型Code Llama。上篇主要介绍Code Llama的基本情况并基于Hug…

Linux系统编程_文件编程第2天:写整数、结构体,fopen等

1. 文件编程小应用之修改程序的配置文件&#xff08;407.10&#xff09; FILE/demo14.c #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdio.h> #include <unistd.h> #include <string.h> #include <s…

VSCode 调试 u-boot

文章目录 VSCode 调试 u-boot调试配置启动 u-boot 脚本调试界面重定向之后继续调试参考 VSCode 调试 u-boot 调试配置 参考 qemu基础篇——VSCode 配置 GDB 调试 要想调试 u-boot 只需要再添加一个 u-boot 的配置即可 {"version": "0.2.0","conf…