点击上方“方志朋”,选择“设为星标”

做积极的人,而不是积极废人

来源:http://uee.me/aXfMY

  • 一、引言

  • 二、LTW(Load Time Weaving)

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

  • 四、代码及演示效果

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

  • 六、总结


一、引言

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

二、LTW(Load Time Weaving)

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

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

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

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

-javaagent:[=options]

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

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

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

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

  • ClassFileTransformer

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

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

  • Instrumentation

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

具体工作原理是这样的:

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

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

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

四、代码及演示效果

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

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

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

  • 其次,我们再实现一个代理类

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

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

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

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

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

六、总结

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

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

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

热门内容:

  • 彻底透析SpringBoot jar可执行原理

  • Apache架构师的30条设计原则!

  • 盘点阿里巴巴 15 款开发者工具

  • 详细介绍!Linux 上几种常用的文件传输方式

  • 看我如何作死 | 将CPU、IO打爆

  • 面试时写不出排序算法?看这篇就够了

  • 网易云音乐的消息队列改造之路

  • Elasticsearch性能优化实战指南

  • 几种常用 JSON 库性能比较

喜欢就点个"在看"呗^_^

面试官:谈谈你对 Spring AOP 的了解?请加上这些内容,绝对加分!相关推荐

  1. 面试官:谈谈分库分表吧?

    面试官:"有并发的经验没?"  应聘者:"有一点."   面试官:"那你们为了处理并发,做了哪些优化?"   应聘者:"前后端分离 ...

  2. 百度面试官:来聊聊Spring吧

    文章目录 Spring入门和IOC介绍 1. Spring介绍 1.1侵入式概念 1.2 松耦合概念 1.3 切面编程 2. 引出Spring 2.1 IOC控制反转 3.Spring模块 4. Co ...

  3. 联合索引会创建几个索引_面试官:谈谈你对mysql联合索引的认识?

    引言 这篇文章作为<面试官:谈谈你对mysql索引的认识>的续篇,我当时在写这篇的时候,考虑到篇幅问题所以略去了联合索引的内容,今天给大家补上. 本文预计分为两个部分:(1)联合索引部分的 ...

  4. 【Spring】3.助你跟面试官侃一个小时的AOP

    使用 代理模式 是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关系 ...

  5. 【232期】面试官:如何保护 Spring Boot 配置文件敏感信息?

    点击上方"Java精选",选择"设为星标" 别问别人为什么,多问自己凭什么! 下方有惊喜,留言必回,有问必答! 每天 08:15 更新文章,每天进步一点点... ...

  6. 面试官: 谈谈什么是守护线程以及作用 ?

    来自:小哈学Java 目录 一.什么是守护线程 二.守护线程的作用及应用场景 三.总结 一.什么是守护线程 守护线程相对于正常线程来说,是比较特殊的一类线程,那么它特殊在哪里呢?别急,在了解它之前,我 ...

  7. 吊打面试官系列之--吃透Spring ioc 和 aop (中)

    目录 Spring SpringBean的五个作用域 SpringBean的生命周期 创建过程 销毁过程 AOP的介绍和使用 AOP的介绍 AOP的三种织入方式 操作讲解 AOP的主要名词概念 Adv ...

  8. 程序员面试怎么回答面试官:你对Spring的理解?

    spring呢,是pivotal公司维护的一系列开源工具的总称,最为人所知的是spring mvc,事实上,他们都是基于spring framework,并且再其上继续增强,为某一方面服务的java组 ...

  9. 面试官问我:spring、springboot、springcloud的区别,我笑了

    好吧,可能某些项目还在使用dubbo,但是你也一定听过Spring Cloud.至于Spring和Spring Boot,对于现在的Java开发,它们的地位简直可以说是不可或缺了.如果你的新项目在使用 ...

最新文章

  1. AI让边缘更智能,边缘让AI无处不在
  2. MODS: Fast and Robust Method for Two-View Matching
  3. 模拟实现EXT2文件系统
  4. JAVA入门级教学之(for循环)
  5. could not start avd怎么解决_双十一又到了,你的购物车塞满了吗?「购物车」用英语该怎么说?...
  6. LNMP架构的搭建--源码编译(MYSQL,PHP,nginx)
  7. 【报告分享】2020美妆行业短视频营销报告.pdf(附下载链接)
  8. java mysql 分页计算公式_关于Java的分页算法,急!
  9. cloudflare 关于tls 检测,发送未知message type字节
  10. 快速查找对方IP地址经典技巧汇总
  11. 云打印SDK来袭,支持飞鹅云,芯烨云,易联云,优声云等云打印机
  12. 没有配置任何软件的计算机上能够运行,禁止电脑安装任何软件
  13. 单元测试总结反思_单元测试反思300字
  14. Kubernetes -K8S安装部署及SpringCloud应用
  15. Python生成图文并茂PDF报告
  16. 您好!欢迎关注异贝!异贝是中国8000万中小微企业忠实的朋友,与您一起成长。异贝商学院今天与您分享:健身行业异贝引客、锁客方案设计!
  17. 淘宝特价版推出省心版,为什么难“钉“老人心?
  18. android白屏优化方案,优化Android App启动白屏
  19. PHP的ereg()与eregi()的不同及相同点。对比
  20. FristiLeaks_1.3#攻略

热门文章

  1. 分治策略解决幂乘问题
  2. Gridview改变单元格颜色
  3. MySql存储引擎特性对比
  4. Wiz开发 定时器的使用与处理
  5. NYOJ 366 D的小L
  6. UVA 10041 Vito's Family
  7. 突然想起99年的那次离别
  8. 肝货,详解 tkinter 图形化界面制作流程!
  9. 干货!用 Python 快速构建神经网络
  10. 面了大厂的 Python 岗后,炸了!