springaop需要的jar包_HR:谈谈你对SpringAOP的了解?回答时加上这些内容,绝对加分!...

bc96e0d956b98c17c5182ba4129f1fef.png

一、引言

众所周知,一旦提到AOP,相信大家都是条件反射的想到JDK代理和CGLib代理,没错,这两个代理都是在运行时内存中临时生成代理类,故而又称作运行时增强——动态代理。世间万物都不是绝对的,既然有动态代理,那么,是否有想过:是不是存在静态代理呢?

二、LTW(Load Time Weaving)

其实,除了运行时织入切面的方式外,我们还有一种途径进行切面织入,它可以在类加载期通过字节码转换,进而将目标织入切入点(目标类),这种方式就是LTW,即静态代理(静待代理也被称作编译时增强,后面会有相关代码样例)。

LTW在Java5的时候就被引入了,想要了解其原理,先要了解一个知识——Instrument包。

三、java.lang.instrument包的工作原理

JDK5.0时引入了此包,目的就是为了能对JVM底层组建进行访问。如何访问?其实说来个人觉得还挺麻烦的,就是需要通过JVM的启动参数-javaagent在启动时获取JVM内部组件的引用。参数格式如下:

-javaagent:<jarpath>[=options]
此处先卖个关子,不急着解释参数中的jarpath和options,后面的运行代码及结果的样例中会进行针对使用红框标记说明,效果更好。

那么,它和AOP有和关系呢?

因为它在JVM启动时会装配并应用ClassTransformer,对类字节码进行转换,进而实现AOP的功能。

下面说一下instrument包下的两个重要接口:

  • ClassFileTransformer

它是Class文件转换器接口,这个接口有且仅有一个方法,如图所示:

d009115097e3d80f980821740fc8b02b.png

586038a519162974741dbb5d8989d954.png

注意:transform方法会有一个返回值,类型是byte[],表示转换后的字节码,但是如果返回为空,则表示不进行节码转换处理,千万不要当作是把原先类的字节码清空。

  • Instrumentation

这个接口提供了很多方法,我们主要注意一个方法即可,即:addTransformer方法,它的作用就是把一些ClassFileTransformer注册到JVM内部,接口如图所示:

1981cf58bb80e65377565addbe8e9f87.png

具体工作原理是这样的:

① ClassFileTransformer实例注册到JVM之后,JVM在加载Class文件时,就会先调用ClassFileTransformer的transform()方法进行字节码转换;

② 若注册了多个ClassFileTransformer实例,则按照注册时的顺序进行一次调用。

这样也就实现了从JVM层面截获字节码,进而织入操作者自己希望添加的逻辑,即实现AOP效果。

四、代码及演示效果

说了这么多,来点干货,下面用代码给大家演示一下如何向JVM中注册转换器实现AOP的。为了方便大家阅读,重要的说明笔者已经写在代码的注释上或者图片空白处,大家注意查看。

  • 首先,我们实现一个自己的转换器,用于模拟需要切入的功能

54c3b2f8ddb274dbd2ee7f34faeba4df.png
注意,这里再强调下,代码中的return null;并不是将加载类的字节码置空。
  • 其次,我们再实现一个代理类

541fa2ccc1261532097edb471f855549.png

为什么要实现代理类内,因为不是动态代理呀。。。

  • 最后,我们写一个主函数,代表程序入口

7fe8c0e7f232ead08f5232d24cb3aac4.png

到此为止,我们的Demo算是完成了,先来看一下运行的结果:

ef846ac3e7a1fd8869b1fdec208de318.png

五、打jar的时候需要注意的地方

大家看到执行结果的截图中,cmd界面下运行javaagent参数时指定了一个myTransformer.jar,这个jar是我们自己需要打出来的,可以直接使用eclipse具体步骤如下图所示,注意图中说明:

afddac3a856f726aa702b1b4aebed428.png

cd76c3bf274cc5a8ebfa96ae8472cb59.png

六、总结

大家可以看到,其实使用此类代理并没有动态代理方便,甚至转换器可能会对JVM所有类都产生影响,操作起来更新相对麻烦,实际生产部署时会有很多不便。

但是,写这些是为了让大家更好、更多的去了解AOP,我们所熟知的AOP其实还有很多东西有待我们自身去学习和发现,其实Spring在"操作麻烦"这方面还是做了不少事的,提供了一些xml的配置化管理(此处就不再说了,因为感觉一说又是一大长篇,有兴趣的大家可以自己去看看,多了解写东西总没有坏处),很多情况下已经不需要再配置javaagent参数了。

最后提一句,如果在面试中提到了这些,相信面试官也会有加分吧。

七、福利我是培训出身,但在培训机构里几乎没学到什么东西,毕业后去面试,没面试一个公司才知道自己学的都是过时的课程,每面试一个公司就发现一个新的知识技术,简直跟哥伦布发现新大陆一样,所以打定主意工作后一定要全补学回来。工作后的自学并不简单,找视频,找书籍,找资源异常艰难,也走了很多弯路,所以当初在自学的过程当中自己搜集并组建了一个资源库,里面有java从入门开始到架构师的各种资源,pdf电子书,视频教程,学习路线图,面试题,BAT测试题,以及不时更新的前沿技术。分享给大家,希望大家免受我学习时所受之苦。

Java基础、入门、精通、架构师全套资源​shimo.im
5a3334658a5a78861a2401bcd2786534.png

0c2ce25c8f2a17e209d27bfd0e595cf1.png

854b86d7aca78da652725331a21721f7.png

1d80536d7e8cc4799f50508d1898bf8b.png

1e8d9f1b9f8370669331ae9b221e3bc3.png

cc33adfb5fabb234546a7abc23d0d4a4.png

f4dcfc52eb7d8feb65b2a15b0e32cc9c.png

bcf8228e1d29d17b77b58fae91b0be77.png

推荐阅读:

java钢铁侠-马克51号:HR:“请说下你对Spring的理解,它都用到了那些设计模式?”​zhuanlan.zhihu.com
048e54cf5d33cd14983d117b66abff06.png
java钢铁侠-马克51号:HR:“请说下你对Spring的理解,它都用到了那些设计模式?”​zhuanlan.zhihu.com
048e54cf5d33cd14983d117b66abff06.png
java钢铁侠-马克51号:99.9%的Java程序员都说不清的问题:JVM中的对象内存布局?​zhuanlan.zhihu.com
ef7c5271478ba1e627c9386c9415dfa2.png
java钢铁侠-马克51号:学习最经典的java基础语法大全,编写你的第一个程序!​zhuanlan.zhihu.com
71edd05aa98592a7926c1565e3c3a11c.png
java钢铁侠-马克51号:如何在Intellij IDEA中使用Debug?(文末附资源)​zhuanlan.zhihu.com
185187b007d095ea39760a159fb569fa.png
作者:java架构的傲慢与偏见
出自:今日头条
原文:面试官:谈谈你对SpringAOP的了解?请加上这些内容,绝对加分!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值