浅谈spring——AOP思想(五)

浅谈 Spring AOP框架 (1) AOP (Aspect Oriented Programming) :面向切面编程,它是一种思想,是对某一类事情(某一类问题)的集中处理。而 Spring AOP 是一个框架, 提供了一种对AOP思想的实现,它们的关系和 loC 与 DI 类似。 阅读详情

分类: java 664人阅读 评论(0) 收藏 举报

软件重构的理念,如果多个类中出现相同的代码,可以考虑定义一个共同的抽象类,将这些相同的代码提取到抽象类中。

但如果是重复的横切代码(比如性能监控,方法开始时,执行一段代码,方法快结束时再执行一段代码)就很难采用上面的方式。

如图:


此时,AOP(aspect oriented programming)应运而生,通过横向抽取机制为这类无法通过纵向继承体系进行抽象的重复性代码提供了解决方案。将分散在各个业务逻辑代码中的相同代码,通过横向切割的方式抽取到一个独立的模块中,从而和业务保持一个较低的耦合性。当然抽取只是从代码简洁性、复用性的角度考虑,最终程序执行还是要按原来的串行顺序,一步一步执行。


AOP的专用术语

1. 连接点:程序执行的某个特定位置,如类初始化前、某个方法调用前

2. 切点:特定的连接点,如果将连接点比作数据库中的记录,那么切点相当于查询条件

3. 增加:织入到目标类连接点的一段代码

4. 引介:一种特殊的增强,要为类增加一些属性和方法

5. 织入:将代码添加到连接点上的过程

    编译前织入,要求特殊的java编译器

    类装载织入,要求特殊的类装载器

       动态代理织入,在运行期间为目标类添加增强生成子类的方式

6. 代理:一个类一旦被增强后,就产生一个子类,融合了原类和增强逻辑的功能

    

spring AOP使用两种代理机制:一种基于JDK的动态代理;另一种是基于CGLib的动态代理

区别是JDK只提供接口的代理,而不支持类的代理


代码实例:

一、传统实现

业务逻辑类:

  1. public class ForumServiceImpl implements ForumService {  
  2.   
  3.     public void removeTopic(int topicId) {  
  4.         PerformanceMonitor.begin("com.baobaotao.proxy.ForumServiceImpl.removeTopic");  
  5.         System.out.println("模拟删除Topic记录:"+topicId);  
  6.         try {  
  7.             Thread.currentThread().sleep(20);  
  8.         } catch (Exception e) {  
  9.             throw new RuntimeException(e);  
  10.         }         
  11.         PerformanceMonitor.end();  
  12.     }  

性能监控增强类:

  1. public class PerformanceMonitor {  
  2.     private static ThreadLocal<MethodPerformace> performaceRecord = new ThreadLocal<MethodPerformace>();  
  3.     public static void begin(String method) {  
  4.         System.out.println("begin monitor...");  
  5.         MethodPerformace mp = performaceRecord.get();  
  6.         if(mp == null){  
  7.             mp = new MethodPerformace(method);  
  8.             performaceRecord.set(mp);  
  9.         }else{  
  10.             mp.reset(method);     
  11.         }  
  12.     }  
  13.     public static void end() {  
  14.         System.out.println("end monitor...");  
  15.         MethodPerformace mp = performaceRecord.get();  
  16.         mp.printPerformace();  
  17.     }  
  18. }  

性能实体类:

  1. public class MethodPerformace {  
  2.     private long begin;  
  3.     private long end;  
  4.     private String serviceMethod;  
  5.     public MethodPerformace(String serviceMethod){  
  6.         reset(serviceMethod);  
  7.     }  
  8.     public void printPerformace(){  
  9.         end = System.currentTimeMillis();  
  10.         long elapse = end - begin;  
  11.         System.out.println(serviceMethod+"花费"+elapse+"毫秒。");  
  12.     }  
  13.     public void reset(String serviceMethod){  
  14.         this.serviceMethod = serviceMethod;  
  15.         this.begin = System.currentTimeMillis();  
  16.     }  
  17. }  

总结:增强逻辑已侵入到业务逻辑代码中,扩展性和灵活性都不好。唯一优点就是通过ThreadLocal将非线程安全类改造为线程安全类。


二、JDK动态代理依赖两个类:Proxy和InvocationHandler,其中InvocationHandler是一个接口,用来实现该接口定义的横切逻辑,并通过反射机制调用目标类的代码,动态将增加逻辑和业务逻辑编织在一起。

代码实例:

增强器类:

  1. import java.lang.reflect.InvocationHandler;  
  2. import java.lang.reflect.Method;  
  3.   
  4. public class PerformaceHandler implements InvocationHandler {  
  5.     private Object target;  
  6.     public PerformaceHandler(Object target){  
  7.         this.target = target;  
  8.     }  
  9.     public Object invoke(Object proxy, Method method, Object[] args)  
  10.             throws Throwable {  
  11.         PerformanceMonitor.begin(target.getClass().getName()+"."+ method.getName());  
  12.         Object obj = method.invoke(target, args);  
  13.         PerformanceMonitor.end();  
  14.         return obj;  
  15.     }  
调用类:

  1. //使用JDK动态代理  
  2.         ForumService target = new ForumServiceImpl();  
  3.         PerformaceHandler handler = new PerformaceHandler(target);  
  4.         ForumService proxy = (ForumService) Proxy.newProxyInstance(target  
  5.                 .getClass().getClassLoader(),  
  6.                 target.getClass().getInterfaces(), handler);  
  7.         proxy.removeForum(10);  
  8.         proxy.removeTopic(1012);  
主要是将业务代码和横切代码编织到一起生成代理子类。

参考例子:http://www.iteye.com/topic/683613


三、CGLib动态代理。可以解决没有定义接口的业务方法类。采用底层的字节码技术,为一个类创建子类,并在子类中采用方法拦截技术拦截所有父类方法的调用,并织入增强逻辑。

例子:

  1. import java.lang.reflect.Method;  
  2.   
  3. import net.sf.cglib.proxy.Enhancer;  
  4. import net.sf.cglib.proxy.MethodInterceptor;  
  5. import net.sf.cglib.proxy.MethodProxy;  
  6.   
  7. public class CglibProxy implements MethodInterceptor {  
  8.     private Enhancer enhancer = new Enhancer();  
  9.   
  10.     public Object getProxy(Class clazz) {  
  11.         enhancer.setSuperclass(clazz);  
  12.         enhancer.setCallback(this);  
  13.         return enhancer.create();  
  14.     }  
  15.     public Object intercept(Object obj, Method method, Object[] args,  
  16.             MethodProxy proxy) throws Throwable {  
  17.         PerformanceMonitor.begin(obj.getClass().getName()+"."+method.getName());  
  18.         Object result=proxy.invokeSuper(obj, args);  
  19.         PerformanceMonitor.end();  
  20.         return result;  
  21.     }  
  22. }  

调用类:

  1. //使用CGLib动态代理  
  2.         CglibProxy proxy = new CglibProxy();  
  3.         ForumService forumService = (ForumService)proxy.getProxy(ForumServiceImpl.class);  
  4.         forumService.removeForum(10);  
  5.         forumService.removeTopic(1023);  
参考例子: http://blog.youkuaiyun.com/cb_121/article/details/2653196


不足:

1)目标类的所有方法都添加了性能监控横切逻辑,一刀切并不是我们想要的

2)采用硬编码的方式指定了横切逻辑的织入点

3)我们手动编写代理子类的创建过程,如果为不同的类创建代理时,同样需要再造轮子,无法做到通用性

spring 的aop可以有针对性的解决上面的三个难题

1)采用切点(Pointcut),指定哪些类哪些方法织入增强逻辑

2)通过增强(Advice)描述横切逻辑和方法的具体织入点(方法前、方法后、两端等)

3)通过切面(Advisor)将1和2结合起来。

【小白指南】如何将deepseek引入WPS\Word\Excel中去? 如何将deepseek引入WPS\Word\Excel中去?纯小白都能看的懂,一步步操作就能行 阅读详情

相关推荐

「大模型学习」(11)kv cache与vllm详解,一文读懂!

Key(键):表示上下文的特征。Value(值):表示上下文的内容。Query(查询):表示当前 token 的查询向量。AttentionQKVsoftmaxQKTdkVAttentionQKVsoftmaxdk​​QKT​V),每次生成一个新 token(比如下一个词),模型会再次查看之前的所有K和V,以计算当前 token 的注意力。问题:每次都重新计算之前的 K/V 很浪费!项目维度(简化)含义Q当前 token 的查询向量。

qq_43044037的博客 5405

Spring - 浅谈AOP思想及Spring的三种实现

前言 Spring的核心思想IoC、DI,及beans、context的XML配置都有了一定的理解 下一个是Spring的又一核心:AOP 什么是AOP AOP:Aspect Oriented Programming,面向切面编程 面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,

key_768的博客 1118

kaggle项目:纽约出租车行程时间NYC Taxi Trip Duration

纽约出租车形成时间预测(NYC Taxi Trip Duration)是Kaggle中的一个Playground竞赛。比赛数据集基于2016年纽约市黄色出租车行程记录数据,需要建立一个模型,根据单个行程属性,预测测试集中每次行程的持续时间。Kaggle项目模型XGBoost,评价指标RMSLE。

weixin_42113929的博客 2790

浅谈Spring——AOP

Spring是目前比较常用的框架,其核心是控制反转(IoC)和面向切面编程(AOP)。通过IOC容器管理POJO或JavaBean对象,以及它们之间的耦合关系;通过AOP以动态非入侵的方式增强服务。这篇主要浅谈一下AOP~我们接着以上的实例进行一个自定义注解话的改造。

weixin_45559950的博客 2218

逆向选择启示录:一个失败高频策略如何意外跑赢市场

本文探讨了高频交易中的逆向选择现象,揭示了一个失败的高频策略如何通过简化意外跑赢市场。通过加密货币市场的实证分析和蒙特卡洛模拟,研究发现低预测性的简单策略反而更具鲁棒性,有效规避了逆向选择风险。文章还提供了小币种做市策略的优化框架和实践建议,为量化交易者提供了宝贵洞见。

weixin_29191669的博客 401

从网格划分到端口接地:一份给ADS新手的Momentum RF仿真避坑实操指南

本文为ADS新手提供Momentum RF仿真的实用指南,涵盖网格划分、端口接地、特殊结构处理等关键设置技巧。通过30-50 cells/λ原则、1/10波长限制等黄金法则,帮助用户平衡仿真精度与效率,避免常见错误,提升电磁仿真结果的准确性。

weixin_33692284的博客 505

【Spring】Spring中AOP的简介和基本使用,SpringBoot使用AOP

AOP的全称是Aspect-Oriented Programming,即面向切面编程(也称面向方面编程)。它是面向对象编程(OOP)的一种补充,目前已成为一种比较成熟的编程方式。在传统的业务处理代码中,通常都会进行事务处理、日志记录等操作。虽然使用OOP可以通过组合或者继承的方式来达到代码的重用,但如果要实现某个功能(如日志记录),同样的代码仍然会分散到各个方法中。这样,如果想要关闭某个功能,或者对其进行修改,就必须要修改所有的相关方法。这不但增加了开发人员的工作量,而且提高了代码的出错率。

qq_61024956的博客 5627

GD32F303驱动WS2812B灯带:用TIMER+PWM+DMA解放CPU,实现流畅灯效(附完整代码)

本文详细介绍了基于GD32F303的TIMER+PWM+DMA全自动控制方案,用于高效驱动WS2812B灯带。通过硬件外设协同工作,该方案不仅解放了CPU资源,还能实现复杂的灯光效果,如渐变、流水等。文章提供了完整的代码实现和性能优化技巧,适合嵌入式开发者参考。

weixin_42561143的博客 379

浅谈 Spring AOP 思想

AOP 切面编程 + Spring事务管理 常用注解

PY_XAT_SFZL的博客 1443

华硕ROG玩家国度安装Ubuntu双系统避坑指南:安全启动密钥那些事儿

本文详细解析了在华硕ROG玩家国度设备上安装Ubuntu双系统时,如何正确处理BIOS中的安全启动(Secure Boot)与密钥管理,避免常见的引导失败和Windows系统无法启动问题。指南提供了从数据备份、启动盘制作到BIOS精细设置(如将OS Type改为Other OS而非简单关闭Secure Boot)以及分区规划的完整流程,确保两个系统都能稳定共存。

weixin_29219189的博客 754

从 SAP Gateway 旧 add-ons 卸载到 SAP S/4HANA 转换的清理路线

摘要: SAP Gateway系统的维护难点往往源于历史遗留组件的堆积,而非OData服务本身的复杂性。早期系统为支持多种服务类型而安装的各类add-ons(如IW_SCS、IW_CNT、GW_CORE等),随着系统升级和团队更替逐渐成为技术负债。自SAP NetWeaver 7.40起,核心功能已整合至SAP_GWFND组件,使架构显著简化。在向S/4HANA迁移时,需重点清理已废弃的add-ons(如IW_SCS、IW_GIL等),但必须谨慎验证其关联服务是否仍被调用。组件清理需结合系统日志和调用链分析

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 423

【JAVAEE框架】浅谈 Spring 框架的两大核心思想 AOP 与 IOP

(1) IoC就是控制反转,是指创建对象的控制权的转移。以前创建对象的主动权和时机是由自己把控的,而现在这种权力转移到Spring容器中,并由容器根据配置文件去创建实例和管理各个实例之间的依赖关系。对象与对象之间松散耦合,也利于功能的复用。DI依赖注入, 和控制反转是同一个概念的不同角度的描述,即应用程序在运行时依赖loC容器来动态注入对象需要的外部资源。

程序猿追的博客 1万+

合肥工业大学嵌入式系统原理实验报告

GPKDAT 的6、7引脚设置低电平,设置GPKDAT = 0x30则34灯亮12灯灭,GPKDAT 的4、5、6、7引脚全为高电平,设置GPKDAT = 0xf0,则led灯全灭。注意在烧写时要连接主机后面的USB接口,烧写完成后,要关闭开发板电源,将S2拨动开关置于NAND位置,然后重新开启开发板电源, 则开发板运行刚刚烧入的裸机程序。实验修改要求:在延时不变的条件下,将原程序中四个LED全亮,然后全灭的显示状态,修改为“四个全亮,然后1和2亮(3和4灭),然后3和4亮(1和2灭),最后全灭”。

Martin-share的博客 3097

浅谈AOP以及AspectJ和Spring AOP

导言 AOP(Aspect Orient Programming),作为面向对象编程的一种补充,广泛应用于处理一些具有横切性质的系统级服务,如日志收集、事务管理、安全检查、缓存、对象池管理等。AOP实现的关键就在于AOP框架自动创建的AOP代理,AOP代理则可分为静态代理和动态代理两大类,其中静态代理是指使用AOP框架提供的命令进行编译,从而在编译阶段就可生成 AOP 代理类,因此也称为编译时增强...

呆萌的程序猿 2450

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

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

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

【JAVAEE框架】浅谈 AOP 及代码实现

前置通知@Before:前置增强处理,在目标方法前织入增强处理 后置通知@AfterReturning:后置增强处理,在目标方法正常执行(不出现异常)后织入增强处理 环绕通知@Around:环绕增强处理,在目标方法的前后都可以织入增强处理 最终通知@After:最终增强处理,不论方法是否抛出异常,都会在目标方法最后织入增强处理 异常通知@AfterThrowing:异常增强处理,在目标方法抛出异常后织入增强处理 定义切入点@Pointcut

程序猿追的博客 1万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Spring AOP 浅谈

Spring AOP & JAVA浅谈由来AOP简单概念核心切片概念总结 JAVA浅谈) 由来 Spring框架及衍生产品广泛地应用于商业级工程项目,大家聊起Spring时往往离不开IOC(Inversion Of Control)与AOP(Aspect-oriented Programming), Spring的普及以及其对@AspectJ表达式的支持在一定程度上掩盖了纯粹Aspec...

fanduifandui的博客 397

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

浅谈Spring AOP

浅谈Spring AOP介绍AOP(Aspect Oriented Programming)即面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.这种在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程.面向切面编程(AOP)是从动态角度考虑程序运行过程. 举例: 遍布在整个系统的权限校验、日志输出这两种服务其实和我们开发的功能是相互独立的,不存

小白成长记录 1078

Spring第三谈(aop的实现,切入点表达式,aop的作用,浅谈aop底层)

aop是一个规范,是动态化的一个规范,一个标准 aspectJ:一个开源的专门做aop的框架,spring框架集成了aspectJ框架,通过spring就能够使用aspectj的功能,实现方式有两种:1、使用xml的配置文件:配置全局事务2、使用注解,项目中.

小游子YKY的博客 5402

浅谈spring--AOP与IOC / DI

Spring 是一个开源框架,主要优势是其分层架构,分层架构允许选择使用哪一个组件。 七大模块组成包含Spring Core,AOP,ORM,DAO,Web,Context,Web MVC。 Spring 模块构建在核心容器之上,核心容器定义了创建、配置和管理 bean 对象的方式。组件都可以单独存在,或者与其他一个或多个模块联合实现。  Spring Core Core模块是Spring的核...

九之的博客 9728

浅谈Spring Aop

Aop 是什么? AOP是OOP的延续,是Aspect Oriented Programming的缩写,意思是面向(方面)切面编程。 与OOP对比,面向切面,传统的OOP开发中的代码逻辑是自上而下的,而这些过程会产生一些横切性问题,这些横切性的问题和我们的住业务逻辑关系不大,这些横切性问题不会影响到主逻辑实现的,但是会散落到代码的各个部分,难以维护。AOP是处理一些横切性问题,AOP的编程思想...

qq_33309913的博客 261

浅谈Spring概念(DI,IoC,AOP)

  Spring重要的思想:IoC&amp;DI: 控制反转:将对象的创建权交给了spring 依赖注入:需要有IOC的环境,spring创建这个类的过程中,将这个类的依赖属性注入。就比如EE开发,有三层,分别是Action,Service,DAO。 action是管理,是总管,是分配任务的。 service是事务层,是进行逻辑操作的。 DAO是封装增删改查的。 那很明显,servi...

woshilishu的博客 4710

浅谈Spring AOP的原理和应用

浅谈Spring AOP的原理和应用 1.AOP简介 Aop(Aspect Oriented Programming)大家应该都知道这是面向切面编程思想,主要能够为我们在不影响原来的功能的前提,为软件横向拓展功能。简单来说,把对象中一些公用的行为抽取出来,减少代码冗余性,还可以将业务代码和系统功能代码分离开。以下,我对Spring AOP进行一系列探讨,(注意:Aop是一种思想,以下主要对Spring Aop技术的探讨的) 2.Aop使用的场景 1)权限验证 2)缓存 3)异常统一处理 4)日志系统 5)信

qq_40625116的博客 326

浅谈自己对于spring aop的理解

开始学习spring就被重点的关注ioc和aop这两个关键的部分,今天着重了解下关于aop的一些实现和原理。 aop 面向切面编程 即可以在业务逻辑前后加上需要的无关业务的处理如日志,权限控制等操作,与实际的业务相分离。 首先需要介绍的技术就是AspectJ 了解了这个之后会对spring的aop实现有对比显示出两者的差异。aspectJ是一个由java实现的aop框架,通过对编译期的代码进行...

荣兄2016的博客 1847
上一篇: SpringMVC 使用JSR-303进行校验 @Valid
下一篇: 浅谈spring——增强接口(六)
一条宝鱼
博客等级 码龄16年 57粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值