Spring的AOP详解

Spring AOP详解 一、AOP 1.1、AOP介绍 1.1.1、什么是AOP? 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP(面向对象编程)的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从... 阅读详情

作为一个稀有的Java妹子,所写的所有博客都只是当作自己的笔记,留下证据自己之前是有用心学习的~哈哈哈哈(如果有不对的地方,也请大家指出,不要悄悄咪咪的不告诉我)

一、AOP

1.什么是AOP

1.AOP是面向切面编程,与OOP的纵向继承特点相比,AOP关注的是横向功能的扩展,OOP的最小单位是类,AOP的最小单位是切面。
2.AOP是为了提取出重复的代码,减少代码的冗余,切面就是这些重复代码提取后存放的位置。一般是解决系统级别的问题,如事务、日志监控、身份鉴别等,使得业务代码与这些系统级别的代码区分开。
3.所以AOP其实就是为了简化代码,是程序员更加的轻松,专注业务代码的逻辑。

2.AOP的实现

AOP的底层就是代理模式,代理模式可以在不修改被代理对象的基础上,通过扩展代理类,进行一些功能的附加与增强。代理类和被代理类应该共同实现一个接口,或者是共同继承某个类。

1.静态代理和动态代理

代理分为两种,它们都有增强方法的作用,但是静态代理是在编译期就为目标类添加了相应的功能,而动态代理是在运行期在内存里生成代理对象,不会改变目标类的字节码。

静态代理

需要手动的再写一个类去实现目标接口,然后对目标方法进行增强。

//目标接口
public interface MovieService {
	void paly();
}

//实现类
public class MovieServiceImpl implements MovieService {
	@Override
	public void paly() {
		System.out.println("电影开始拉");
	}
}

以上是原始的业务代码,比如这时候新的需求是在电影放映前插播一些广告,那么在不修改原来的paly方法的前提下,就采用静态代理的方式,创建另外一个类去实现接口。

public class MovieServiceProxy implements MovieService {

	private MovieServiceImpl movieService;
	public MovieServiceProxy(MovieServiceImpl movieService){
		this.movieService = movieService;
	}
	@Override
	public void paly() {
		playAd();
		movieService.paly();
	}

	public void playAd(){
		System.out.println("广告开始。。");
	}
}

public class Test {
	public static void main(String[] args) {
		MovieService movieService = new MovieServiceProxy(new MovieServiceImpl());
		movieService.paly();
	}
}

结果:

广告开始。。
电影开始拉

静态代理在不改变原有的方法前提下,需要新增一个类实现接口,然后在新的静态代理类中去实现方法的增强。

动态代理

动态代理的目的跟静态代理是一样的,就是想在不修改原有实现类的基础上增强方法,与静态代理的区别就是动态代理不需要手动的创建一个类,而是在程序运行时自动在内存中创建目标接口的代理类。

Spring AOP的动态代理有两种,JDK动态代理和CGLIB动态代理,前者是基于接口的代理,后者是基于类的代理。

1.jdk动态代理

主要是通过反射机制,为目标类生成代理类,核心类是:
·InvocationHandler 接口
·Proxy.newProxyInstance(ClassLoader loader,
Class<?>[] interfaces,
InvocationHandler h)

1、 loader:类加载器
2、interfaces:被代理的接口
3、InvocationHandler:InvocationHandler对象

代理类实现了目标接口,调用InvocationHandler执行任务。
还是以刚才的Movie接口举例

//接口
public interface MovieService {
	void paly();
}

//实现类
public class MovieServiceImpl implements MovieService {
	@Override
	public void paly() {
		System.out.println("电影开始拉");
	}
}
public class DynamicService implements InvocationHandler {

	private Object object;

	public DynamicService(Object o){
		this.object = o;
	}


	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		System.out.println("动态代理拉");
		method.invoke(object,args);
		return null;
	}
}

public class Test {
	public static void main(String[] args) {
		InvocationHandler invocationHandler1 = new DynamicService(new MovieServiceImpl());
		MovieService movieService1 = (MovieService)Proxy.newProxyInstance(MovieServiceImpl.class.getClassLoader(), MovieServiceImpl.class.getInterfaces(), invocationHandler1);
		movieService1.paly();
	}
}

结果:

动态代理拉
电影开始拉

再定义一个接口

public interface TVService {
	void paly();
}

public class TVServiceImpl implements TVService {
	@Override
	public void paly() {
		System.out.println("电视剧开始拉");
	}
}

public class Test {
	public static void main(String[] args) {
		InvocationHandler invocationHandler1 = new DynamicService(new MovieServiceImpl());
		MovieService movieService1 = (MovieService)Proxy.newProxyInstance(MovieServiceImpl.class.getClassLoader(), MovieServiceImpl.class.getInterfaces(), invocationHandler1);
		movieService1.paly();
		//定义新的InvocationHandler
		InvocationHandler invocationHandler2 = new DynamicService(new TVServiceImpl());
		TVService tVService = (MovieService)Proxy.newProxyInstance(TVServiceImpl.class.getClassLoader(), TVServiceImpl.class.getInterfaces(), invocationHandler2);
		tVService.paly();
	}
}

结果:

动态代理拉
电影开始拉
动态代理拉
电视剧开始拉

那么这里并没有手动的创建MovieService和TVService的静态代理类,而是通过动态代理获取对应的代理类,并且jdk动态代理,代理类和目标类都实现同一个接口,方法名跟目标类是一样的,只是方法做了增强。

2.CGLIB动态代理

当目标类没有实现任何接口的时候,Spring AOP会选择使用 CGLIB 来动态代理目标类,主要就是通过代理类继承目标类,重写目标类的方法。
核心类是:
·MethodInterceptor 接口
·Enhancer 类

MethodInterceptor这个接口是一个拦截器,每个cglib的代理类都会有一个拦截器,当调用目标类的时候,就会被拦截器拦截,执行代理类的方法。

3.AOP的相关术语

1.通知(Advice)

就是公用的功能

2.连接点(JoinPoint)

允许通知的地方

3.切入点(Pointcut)

具体的某个方法

4.切面(Aspect)

通知和切入点的结合

5.目标(target)

目标类,就是被代理的类,也就是真正的业务逻辑,他可以在毫不知情的情况下,被咱们织入切面。而自己专注于业务本身的逻辑。

6.代理(Proxy)

aop的实现是依靠代理机制

4.实际的例子

在开发中也遇到过很多aop的例子,其实只要理解了aop是为了做什么的,就能发现代码里很多地方都使用了aop,比如Spring的事务,只要在类或者某个方法上加上@Transactional注解,就会开启事务,其实这就是aop为没一个使用该注解的类生成了代理类,代理类的每个方法在执行前会开启事务,执行完会提交事务。
接下来举一个我在实际开发中用到的一个很简单aop例子,就是为某些方法打印入参。

//这是切面
@Component
@Aspect
@Slf4j
public class MethodLogAspect {

	//定义切点,我自定义了一个注解,凡是使用了该注解的方法都会被当作切点
    @Pointcut("@annotation(com.jiebai.qqsk.member.aspect.MethodLog)")
    public void poinCut(){
    }
	//定义了前置通知和后置通知
    @Before("poinCut()")
    public void Before(JoinPoint jp){
        String methodName = jp.getSignature().getName();
        Map<String,String> map = new HashMap<>();
        String[] parameterNames = ((MethodSignature) jp.getSignature()).getParameterNames();
        Object[] args = jp.getArgs();
        if(parameterNames!=null && parameterNames.length>0){
            for(int i=0;i<parameterNames.length;i++){
                map.put(parameterNames[i],args[i].toString());
            }

        }
        log.info("进入方法"+methodName+",参数:"+ JSONObject.toJSONString(map));
    }

    @After("poinCut()")
    public void after(JoinPoint jp){
        String methodName = jp.getSignature().getName();
        log.info("退出方法"+methodName);
    }
}

在使用的时候只需要在方法上加上自定义注解即可

	@Override
    @MethodLog
    public Map<String, Object> userWithdrawGTC(BigDecimal amount, String type, Integer userId) throws Exception {


.....省略业务代码
}
Spring AOP 详解:从入门到实战 本文详细介绍了Spring AOP的核心概念与实际应用。Spring AOP通过面向切面编程解决了企业应用中的横切关注点问题,与传统OOP形成互补。文章阐述了AOP的基本术语(切面、连接点、切点等)和五种通知类型,对比了注解和XML两种配置方式。重点分析了execution切点表达式语法,并通过代码示例展示了如何实现日志、事务和安全等常见切面功能。Spring AOP基于代理实现运行时织入,相比AspectJ更轻量但功能稍有限制。 阅读详情

相关推荐

Spring Aop详解

什么是AOP?AOP英文全称:Aspect Oriented Programming(面向切面编程、面向方面编程),其实说白了,面向切面编程就是面向特定方法编程。那什么又是面向方法编程呢,为什么又需要面向方法编程呢?来我们举个例子做一个说明:比如,我们这里有一个项目,项目中开发了很多的业务功能。然而有一些业务功能执行效率比较低,执行耗时较长,我们需要针对于这些业务方法进行优化。那首先第一步就需要定位出执行耗时比较长的业务方法,再针对于业务方法再来进行优化。

Delu3376451753的博客 1403

Spring之AOP(内存原理)

Spring之AOP(内存原理)

小汤圆 157

LangChain + Milvus Lite:从零搭建本地RAG知识库

本文详细介绍了如何利用LangChain、Milvus Lite和gte-large-zh模型,在本地从零搭建一个完整的RAG知识库系统。文章涵盖了环境配置、文档处理与向量化、本地向量库构建以及检索问答实现的全流程,重点突出了完全本地化部署带来的数据隐私安全和成本优势,为开发者提供了一条实践性极强的技术路径。

weixin_29044713的博客 443

提高代码质量——AOP面向切面编程

王元肉==>个人主页 大家一起加油,我喜欢分专栏将知识打碎成一份一份小知识点,一篇文章只说一个知识点,因此每篇文章篇幅较短,希望大家不要介意。如有需要可以查看专栏看看是否有该文章中涉及到的知识点进行讲解的文章,如果大家觉得有帮助,希望大家三连支持一下。 文章结构什么是面向切面编程我们为什么要用面向切面编程实际业务代码感受不足优化1减少内存占用与性能消耗,简洁化代码优化2增强程序的健壮性,避免人为bug小例子加深概念demo1demo2 什么是面向切面编程 在软件业,AOP为Aspect

浪头的博客 1607

分享一下如何使用labelimg制作自己的YOLO数据集

首先准备一下自己的下准备一个空文件夹用于保存标签文件,如下图所示。

skywalkerxhx的博客 830

肺癌术后随访离散选择实验(DCE)设计与SAS实现

随着肺癌早期诊断和治疗技术的进步,肺癌患者的生存率显著提高,术后随访管理成为提升患者生活质量的关键环节。然而,如何在有限的医疗资源下设计出既符合患者需求又具有成本效益的随访方案,是临床决策面临的重要挑战。 离散选择实验(Discrete Choice Experiment, DCE)是一种定量研究方法,通过模拟真实世界的选择情境,测量患者对不同随访方案属性的偏好程度。本研究旨在通过DCE方法,系统评估肺癌术后患者对随访服务的偏好,为制定以患者为中心的随访策略提供循证依据。

huanghm88的专栏 96

java aop性能检测_java – 在内存消耗的情况下,Spring AOP有多高效

如果使用AOP性能会比这更好,因为它是经过良好测试和优化的框架来做这样的操作.无论如何,您可以通过减去开始和结束时间来检查.您可以使用当前代码和AOP实现的代码来检查性能.这将是非常有趣的工作.做如下所示的设置开始和结束时间和减去.System.currentTimeMillis()以上语法,返回当前时间(以毫秒为单位).请注意,虽然返回值的时间单位为毫秒,但该值的粒度取决于底层操作系统,并且可能...

weixin_28846405的博客 1081

LeRobot 入门教程(四)SO-101机械臂组装教程

《SO-101机器人组装与配置指南》详细介绍了旗舰机器人SO-101的完整搭建流程。从获取3D打印零件、安装LeRobot软件和FeetechSDK,到分步组装6个关节的机械臂结构(含夹爪/手柄选项),指南提供了清晰的螺丝规格和安装位置说明。重点包括:电机ID/波特率设置方法、USB端口识别技巧、领导者/跟随者臂的校准流程,以及故障排查建议。完成组装后,用户可通过配套Python脚本校准机器人,为后续的自主学习任务做好准备。文档附有视频演示和技术支持通道,确保用户顺利完成机器人部署。

2506_90492529的博客 2581

SpringAOP(图文详解)

Spring实现的AOP是代理模式,给调用者使用的实际是已经过加工的对象,你编程时方法体里只写了A,但调用者拿到的对象的方法体却是xAy。x和y总还是需要你来写的,这就是增强。x和y具体在什么时候被调用总还是需要你来规定的,虽然是基于约定的声明这种简单的规定,这就是切点。

lhj520cb的博客 5万+

【车联网】Automotive 软件过程能力成熟度模型——ASPICE标准入门介绍

ASPICE标准详细定义了与汽车电子软件开发相关的各种术语和概念,包括软件组件、系统集成、测试和验证等。这些定义确保了所有开发团队在使用相同术语时具有一致的理解。

奶爸的编程之路,也就一周冷个三天 2676

AI使能的SVD算子:基于深度学习的矩阵分解方法

奇异值分解(Singular Value Decomposition, SVD)是线性代数中一种重要的矩阵分解方法,广泛应用于信号处理、数据降维、推荐系统等领域。传统SVD算法虽然精确,但在处理大规模矩阵时面临计算复杂度高、内存需求大等问题。本文提出了一种基于深度学习神经网络的SVD算子实现方法,完全摒弃传统数值算法,仅使用PyTorch框架构建的神经网络模型来完成大规模信道矩阵的SVD分解与还原。

huanghm88的专栏 1316

图文详解Spring AOP,你学会了吗?

如果说 IOC 是 Spring 的核心,那么面向切面编程AOP就是 Spring 另外一个最为重要的核心,需要重点掌握@mikechen 本篇主要会详解以下六点: 1.AOP的定义 2.AOP的作用 3.AOP的应用场景 4.Spring AOP的术语 AOP核心概念 Spring AOP 通知分类 Spring AOP 织入时期 5.Spring AOP三种使用方式 方式1:使用Spring自带的AOP 方式2:使用Aspectj实现切面(普通POJO的实现方式) 方式3:使用As

qq_39652397的博客 3488

YOLOv11 改进 - 注意力机制 | HaloNet 局部自注意力 (Local Self-Attention) 以分块交互策略实现高效全局上下文建模

本文介绍了局部自注意力机制(HaloAttention)在YOLOv11中的结合应用。局部自注意力通过关注输入数据局部区域来捕捉特征关系,能降低计算复杂度、增强局部特征捕捉,且可与CNN结合。其计算时先定义局部窗口,再计算注意力权重并加权求和。我们将HaloAttention集成到YOLOv11的检测头中,并进行相关注册和配置。实验表明,改进后的模型在目标检测和实例分割等任务中表现更佳,证明了自注意力模型在传统卷积主导领域的有效性。

魔改工程师的博客 1139

Spring AOP全面详解

AOP(Aspect Orient Programming),即面向切面编程,是一种编程思想,用于在不修改源代码的情况下动态地给程序添加额外功能。它通过横向抽取机制取代了传统纵向继承机制的重复性代码,主要应用在事务处理、日志管理、权限控制等方面,分离功能性需求和非功能性需求,减少对业务代码的侵入,增强代码的可读性和可维护性。增强处理(Advice)是在AOP框架中为普通业务组件织入的处理动作。前置通知(Before):在目标方法执行前执行。后置通知。

ning的博客 1500

最全面的行人重识别数据集汇总

汇总了一些REID的数据集,几乎涵盖了所有的数据集。如果有缺少的欢迎留言补充。我将能下载到的数据集放在了网盘里,链接如下:链接:https://pan.baidu.com/s/1hQ4PKvtAhAvoZiXbcIu93w 提取码:o3iyQMUL iLIDS基于iLIDS MCTS的数据集,是一个在机场繁忙时候通过监控系统中多个摄像头收集到的数据集。几乎每个ID(identity)都有从两个无重叠(区域)的摄像头拍摄的四幅图像。该数据集具有严重遮挡和姿势差异的场景。

m0_47867638的博客 1万+

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

spring AOP详解

AOP(Aspect Orient Programming)是一种设计思想,是软件设计领域中的面向切面编程,它是面向对象编程(OOP)的一种补充和完善;

是程序喵呀 4198

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

详解Spring AOP篇一

详解AOP及Spring AOP的使用,以及AOP面向切面编程的优势。

. 2642

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

详解Spring AOP

Aspect Oriented Programming(面向切面编程),OOP是面向对象编程(开发的时候把一个个都抽象成对象来开发),两者的维度不同,处理的事情不同切⾯就是指某⼀类特定问题, 所以AOP也可以理解为⾯向特定⽅法编程。面向切面编程就是针对某一类特定问题统一进行编程比如people类有自己的属性和行为,但是有小一部分人生病要去医院看病,看病这个业务逻辑就不属于哪一个类,因为people泛指所有人,所有人不会都看病。

N_0050的博客 2030

Spring AOP 详解

Spring AOP(Aspect-Oriented Programming,面向切面编程)是Spring框架提供的一种编程范式,它允许开发者将横切关注点(如日志、事务管理、权限检查等)与业务逻辑分离,从而提高代码的模块化和可维护性。Spring AOP 基于代理机制实现,它为Spring应用提供了声明式事务管理等功能。

2301_80035594的博客 6824

Spring AOP用法详解

AOP:Aspect Oriented Programming,中文翻译为”面向切面编程“。面向切面编程是一种编程范式,它作为OOP面向对象编程的一种补充,用于处理系统中分布于各个模块的横切关注点,比如事务管理、权限控制、缓存控制、日志打印等等。AOP采取横向抽取机制,取代了传统纵向继承体系的重复性代码

深圳市多克创新科技有限公司 1678

Spring之AOP详解

AOP介绍 AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善。 面向切面是面向对象中的一种方式而已。在代码执行过程中,动态嵌入其他代码,叫做面向切面编程。常见的使用场景: i :日志 ii: 事务 iii:数据库操作 … 面向切面编程的几个核心概念 概念 ...

波波烤鸭的博客 6643

spring aop详解

1.前言 spring aop是一个面向切面的编程,在自己第一遍学习的时候,感觉aop没有什么作用,但是真实接触下来,感觉spring aop还是很有用途的,感觉自己之前的想法太年轻了。 2.概念 Spring 提供了两种AOP 的实现:基于注解式配置和基于XML配置,我这里主要就是介绍一下,基于注解式配置。 2.1 AOP 即 Aspect Oriented Program 面向切面编程 首先,在面向切面编程的思想里面,把功能分为核心业务功能,和周边功能。 所谓的核心业务,工作中做的最多的

hanbin1998的博客 6563

【SpringBoot】Spring AOP详解

本期讲解:什么是Spring AOP,以及SpringAOP的前直通知、后置通知、返回之后通知、抛异常后通知、环绕通知。

我的主页 4383
上一篇: Java常用类:AtomicInteger类详解
下一篇: redis缓存数据库详解(一):config文件详解
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值