面试官:谈谈你对SpringAOP的了解?请加上这些内容,绝对加分!

栏目: Java · 发布时间: 5年前

内容简介:作者:Java架构的傲慢与偏见 原文地址:www.toutiao.com/a6695345484485100044众所周知,一旦提到AOP,相信大家都是条件反射的想到JDK代理和CGLib代理,没错,这两个代理都是在其实,除了运行时织入切面的方式外,我们还有一种途径进行切面织入,它可以在

作者:Java架构的傲慢与偏见 原文地址:www.toutiao.com/a6695345484485100044

一、引言

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

二、LTW(Load Time Weaving)

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

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

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

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

-javaagent:[=options]

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

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

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

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

  • ClassFileTransformer

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

面试官:谈谈你对SpringAOP的了解?请加上这些内容,绝对加分!
面试官:谈谈你对SpringAOP的了解?请加上这些内容,绝对加分!

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

  • Instrumentation

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

面试官:谈谈你对SpringAOP的了解?请加上这些内容,绝对加分!

具体工作原理是这样的:

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

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

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

四、代码及演示效果

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

  • 首先,我们实现一个自己的转换器,用于模拟需要切入的功能
    面试官:谈谈你对SpringAOP的了解?请加上这些内容,绝对加分!

注意,这里再强调下,代码中的return null;并不是将加载类的字节码置空。

  • 其次,我们再实现一个代理类
    面试官:谈谈你对SpringAOP的了解?请加上这些内容,绝对加分!

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

  • 最后,我们写一个主函数,代表程序入口
    面试官:谈谈你对SpringAOP的了解?请加上这些内容,绝对加分!

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

面试官:谈谈你对SpringAOP的了解?请加上这些内容,绝对加分!

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

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

面试官:谈谈你对SpringAOP的了解?请加上这些内容,绝对加分!
面试官:谈谈你对SpringAOP的了解?请加上这些内容,绝对加分!

六、总结

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

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

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

热门内容:

1、 系统又出Bug?这几个调优攻略,帮你解决大部分问题!

2、 20万用户同时访问一个热点Key,如何优化缓存架构?

3、 多线程,到底该设置多少个线程?

4、 生产环境下到底该如何部署Tomcat?

5、 神级代码注释鉴赏,喜欢就拿去用!

6、 开源的13个Spring Boot 优秀学习项目!超53K星,一网打尽!

7、 华为海思总裁致员工信:不再有换胎机会,必当科技自立!

8、 不了解这12个语法糖,别说你会Java!

面试官:谈谈你对SpringAOP的了解?请加上这些内容,绝对加分!

【视频福利】2T免费学习视频, 搜索或扫描上述二维码关注微信公众号:Java后端技术(ID: JavaITWork),和20万人一起学Java!回复: 1024 ,即可免费获取!内含SSM、Spring全家桶、微服务、 MySQL 、MyCat、集群、分布式、中间件、 Linux 、网络、多线程,Jenkins、Nexus、 Docker 、ELK等等免费学习视频,持续更新!


以上所述就是小编给大家介绍的《面试官:谈谈你对SpringAOP的了解?请加上这些内容,绝对加分!》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

移动的帝国

移动的帝国

曾航、刘羽、陶旭骏 / 浙江大学出版社 / 2014-1-1 / 48.00

日本是全世界移动互联网最发达的国家之一,堪称移动的帝国。在手机游戏、手机支付、移动医疗、移动电子商务、手机电视等方面,日本都充当了全球移动互联网的试验田。 曾经傲视全球的日本运营商将怎样面对转型的挑战?iPhone来势汹汹,如何打破封闭的日本移动互联网体系?日本在智能手机时代的手机游戏、O2O、移动医疗、移动广告等方面,涌现出了哪些值得借鉴的商业模式? 本书作者团队先后数次前往日本调研......一起来看看 《移动的帝国》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具