spring aop的实现

spring aop的实现AOP(Aspect Orient Programming),我们一般称为面向方面(切面)编程,作为面向对象的一种补充,用于处理系统中分布于各个模块的横切关注点,比如事务管理、日志、缓存等等。AOP实现的关键在于AOP框架自动创建的AOP代理,AOP代理

AOP(Aspect Orient Programming),我们一般称为面向方面(切面)编程,作为面向对象的一种补充,用于处理系统中分布于各个模块的横切关注点,比如事务管理、日志、缓存等等。AOP实现的关键在于AOP框架自动创建的AOP代理,AOP代理主要分为静态代理和动态代理,静态代理的代表为AspectJ;而动态代理则以Spring AOP为代表。本文会分别对AspectJ和Spring AOP的实现进行分析和介绍。

使用AspectJ的编译时增强实现AOP

之前提到,AspectJ是静态代理的增强,所谓的静态代理就是AOP框架会在编译阶段生成AOP代理类,因此也称为编译时增强。

举个实例的例子来说。首先我们有一个普通的Hello类

spring aop的实现

使用AspectJ编写一个Aspect

spring aop的实现

这里模拟了一个事务的场景,类似于Spring的声明式事务。使用AspectJ的编译器编译

ajc -d . Hello.java TxAspect.aj

编译完成之后再运行这个Hello类,可以看到以下输出

开始事务 ...
hello
事务结束 ...

显然,AOP已经生效了,那么究竟AspectJ是如何在没有修改Hello类的情况下为Hello类增加新功能的呢?

查看一下编译后的Hello.class

spring aop的实现

可以看到,这个类比原来的Hello.java多了一些代码,这就是AspectJ的静态代理,它会在编译阶段将Aspect织入Java字节码中, 运行的时候就是经过增强之后的AOP对象。

public void ajc$around$com_listenzhangbin_aop_TxAspect$1$f54fe983(AroundClosure ajc$aroundClosure) {
 System.out.println("开始事务 ...");
 ajc$around$com_listenzhangbin_aop_TxAspect$1$f54fe983proceed(ajc$aroundClosure);
 System.out.println("事务结束 ...");
 }

从Aspect编译后的class文件可以更明显的看出执行的逻辑。proceed方法就是回调执行被代理类中的方法。

使用Spring AOP

与AspectJ的静态代理不同,Spring AOP使用的动态代理,所谓的动态代理就是说AOP框架不会去修改字节码,而是在内存中临时为方法生成一个AOP对象,这个AOP对象包含了目标对象的全部方法,并且在特定的切点做了增强处理,并回调原对象的方法。

Spring AOP中的动态代理主要有两种方式,JDK动态代理和CGLIB动态代理。JDK动态代理通过反射来接收被代理的类,并且要求被代理的类必须实现一个接口。JDK动态代理的核心是InvocationHandler接口和Proxy类。

如果目标类没有实现接口,那么Spring AOP会选择使用CGLIB来动态代理目标类。CGLIB(Code Generation Library),是一个代码生成的类库,可以在运行时动态的生成某个类的子类,注意,CGLIB是通过继承的方式做的动态代理,因此如果某个类被标记为final,那么它是无法使用CGLIB做动态代理的。

为了验证以上的说法,可以做一个简单的测试。首先测试实现接口的情况。

定义一个接口

public interface Person {
 String sayHello(String name);
}

实现类

spring aop的实现

这里的@Timer注解是我自己定义的一个普通注解,用来标记Pointcut。

定义Aspect

spring aop的实现

运行

spring aop的实现

输出

before
-- sayHello() --
class com.sun.proxy.$Proxy53

可以看到类型是com.sun.proxy.$Proxy53,也就是前面提到的Proxy类,因此这里Spring AOP使用了JDK的动态代理。

再来看看不实现接口的情况,修改Chinese类

spring aop的实现

运行

spring aop的实现

输出

before
-- sayHello() --
class com.listenzhangbin.aop.Chinese$$EnhancerBySpringCGLIB$$56b89168

可以看到类被CGLIB增强了,也就是动态代理。这里的CGLIB代理就是Spring AOP的代理,这个类也就是所谓的AOP代理,AOP代理类在切点动态地织入了增强处理。

小结

AspectJ在编译时就增强了目标对象,Spring AOP的动态代理则是在每次运行时动态的增强,生成AOP代理对象,区别在于生成AOP代理对象的时机不同,相对来说AspectJ的静态代理方式具有更好的性能,但是AspectJ需要特定的编译器进行处理,而Spring AOP则无需特定的编译器处理。

原文地址:
http://listenzhangbin.com/post/2016/09/spring-aop-cglib/

作者:Listen

激活谷谷主为您准备了激活教程,为节约您的时间请移步至置顶文章:https://sigusoft.com/99576.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/15591.html

(0)
上一篇 2024年 5月 19日
下一篇 2024年 5月 19日

相关推荐

  • airplayersink什么意思_airplayer是什么

    airplayersink什么意思_airplayer是什么苹果录屏大师(AirPlayer)iOS 11怎么开镜像?1.打开录屏大师(首次开启录屏大师程序后,系统会弹出“是否允许AirPlayer程序通过防火墙” ,请选择 是,允许访问)2.选择 iOS 系统版本3.手机端打开 控制中心(屏幕底部

    2024年 5月 29日
  • html心得体会200字_html心得体会1000字

    html心得体会200字_html心得体会1000字html网页心得体会html网页设计的心得体会推荐度:html网页心得体会推荐度:html网页设计心得体会推荐度:相关推荐html网页心得体会范文(精选22篇)我们有一些启发后,写一篇心得体会,记录下来,通过写心得体会,可以帮助我们总结积累经验。

    2024年 5月 23日
  • 产品doe是什么意思_产品dom是啥意思

    产品doe是什么意思_产品dom是啥意思电子电器/LED灯具产品美国能效法规DOE认证怎么注册流程详解最近正好碰到有人在询问DOE的问题,而且还是行业内的人,我想对于DOE的相关知识,平时不是经常接触的人可能不太清楚,那正好今天有时间,就给

    2024年 5月 31日
  • ddsj-308a型电导率仪使用说明_ddsj-308a电导率仪的使用方法

    ddsj-308a型电导率仪使用说明_ddsj-308a电导率仪的使用方法新闻资讯DDSJ-308A电导率仪操步骤DDSJ-308A 型电导率仪是一种智能化的实验室常规分析仪器。它适用于实验室内精确测量水溶液、总溶解固体和温度的电导率和温度,也可用于测量纯水的纯度和温度,以及用于测定盐(nacl 为标准)的海

    激活谷笔记 2024年 5月 24日
  • substancepainter保存不了怎么办_substance painter保存不了

    substancepainter保存不了怎么办_substance painter保存不了substance painter画贴图很卡怎么升级配置?sp画贴图2k还好,4k开关一个图层进度条读半天才出来。需要升级电脑什么配置?显卡显存?cpu?内存?substance painter卡顿怎么办?升级显卡:Substance Painter是一个GPU密集型应用程序,因此拥

    2024年 5月 26日
  • 反相积分器实验报告怎么写_反相积分器实验报告怎么写的

    反相积分器实验报告怎么写_反相积分器实验报告怎么写的一些不能再基础的模拟电路思考(17)大家可能对积分器的作用不太了解。在另一个专栏里面稍微分析了一下反相积分器的一些特点,是关于电路参数级别的。但是积分器到底能够起一些什么样的作用,在哪里出现是陌生的。仍然以理想反相积分器为例。反相积分器其时域特征为:频域特征为:时域特征能够清

    2024年 5月 26日
  • word是什么意思 翻译_word的中文意思翻译

    word是什么意思 翻译_word的中文意思翻译word汉语翻译n. 话, 消息, 词, 诺言, 命令vt. 用言辞表达【计】 字相关词组: at a word be as good as one’s word believe sb’s bare word beli

    激活谷笔记 2024年 5月 12日
  • prodigies是什么意思_prodigies是什么意思中文翻译

    prodigies是什么意思_prodigies是什么意思中文翻译PRODIGY是什么意思_PRODIGY用英语怎么说_PRODIGY的翻译_PRODIGY翻译成_PRODIGY的中文意思_PRODIGY怎么读,PRODIGY的读音,PRODIGY的用法,PRODIGY的例句

    激活谷笔记 2024年 5月 27日
  • DataSpell激活2024.1.1(JetBrains DataSpell v2024.1.1(DS-241.15989.62)[X64/Arm64])

    DataSpell激活2024.1.1(JetBrains DataSpell v2024.1.1(DS-241.15989.62)[X64/Arm64])

    激活谷笔记 2024年 6月 7日
  • spiritfarer材料一览_spiritfarer 材料

    spiritfarer材料一览_spiritfarer 材料《Spiritfarer》鱼类等素材分布位置一览 木材在哪里有?Spiritfarer木材在哪里有?游戏中有不少素材需要收集,这里给大家带来了Spiritfarer鱼类等素材分布位置一览,需要的玩家快来看下吧。Spiritfarer鱼类等素材分布位置一览鱼类钓点初始区域—&

    2024年 5月 24日
  • 正则表达式 数字加1怎么输入

    正则表达式 数字加1怎么输入前面最近闲着没事,想给自己找找新的东西学习一下。正则表达式的学习也是一年前就有了萌芽了。正好最近在写QT项目时,对于网络编程中IP地址的合法性的判断中,使用到了正则表达式。QRegExp regExp(“((2[0-4]\\d|25[0-5]|[01]?\\d\

    激活谷笔记 2024年 5月 18日
  • word文档怎么把两页并排_word怎么取消左右分页排版

    word文档怎么把两页并排_word怎么取消左右分页排版0. 专栏简介,又到了一年一度的毕业论文启动的时间了,本人从本科,硕士,博士到如今的博士后,一路牛马,仍未能在学术上有太高的建树,但是在此过程中,到是与各种形式的论文打了不少的交道。在学术的道路上,我经历了各种酸甜苦辣,深知学术论文与学位论文排版的重要性。从今天开始,我想和大家分享一些我在论

    2024年 5月 17日
关注微信