面试官:谈谈你对 Spring AOP 的了解?请加上这些内容,绝对加分!
点击上方“方志朋”,选择“设为星标”
做积极的人,而不是积极废人
来源: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 的了解?请加上这些内容,绝对加分!相关推荐
- 面试官:谈谈分库分表吧?
面试官:"有并发的经验没?" 应聘者:"有一点." 面试官:"那你们为了处理并发,做了哪些优化?" 应聘者:"前后端分离 ...
- 百度面试官:来聊聊Spring吧
文章目录 Spring入门和IOC介绍 1. Spring介绍 1.1侵入式概念 1.2 松耦合概念 1.3 切面编程 2. 引出Spring 2.1 IOC控制反转 3.Spring模块 4. Co ...
- 联合索引会创建几个索引_面试官:谈谈你对mysql联合索引的认识?
引言 这篇文章作为<面试官:谈谈你对mysql索引的认识>的续篇,我当时在写这篇的时候,考虑到篇幅问题所以略去了联合索引的内容,今天给大家补上. 本文预计分为两个部分:(1)联合索引部分的 ...
- 【Spring】3.助你跟面试官侃一个小时的AOP
使用 代理模式 是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关系 ...
- 【232期】面试官:如何保护 Spring Boot 配置文件敏感信息?
点击上方"Java精选",选择"设为星标" 别问别人为什么,多问自己凭什么! 下方有惊喜,留言必回,有问必答! 每天 08:15 更新文章,每天进步一点点... ...
- 面试官: 谈谈什么是守护线程以及作用 ?
来自:小哈学Java 目录 一.什么是守护线程 二.守护线程的作用及应用场景 三.总结 一.什么是守护线程 守护线程相对于正常线程来说,是比较特殊的一类线程,那么它特殊在哪里呢?别急,在了解它之前,我 ...
- 吊打面试官系列之--吃透Spring ioc 和 aop (中)
目录 Spring SpringBean的五个作用域 SpringBean的生命周期 创建过程 销毁过程 AOP的介绍和使用 AOP的介绍 AOP的三种织入方式 操作讲解 AOP的主要名词概念 Adv ...
- 程序员面试怎么回答面试官:你对Spring的理解?
spring呢,是pivotal公司维护的一系列开源工具的总称,最为人所知的是spring mvc,事实上,他们都是基于spring framework,并且再其上继续增强,为某一方面服务的java组 ...
- 面试官问我:spring、springboot、springcloud的区别,我笑了
好吧,可能某些项目还在使用dubbo,但是你也一定听过Spring Cloud.至于Spring和Spring Boot,对于现在的Java开发,它们的地位简直可以说是不可或缺了.如果你的新项目在使用 ...
最新文章
- AI让边缘更智能,边缘让AI无处不在
- MODS: Fast and Robust Method for Two-View Matching
- 模拟实现EXT2文件系统
- JAVA入门级教学之(for循环)
- could not start avd怎么解决_双十一又到了,你的购物车塞满了吗?「购物车」用英语该怎么说?...
- LNMP架构的搭建--源码编译(MYSQL,PHP,nginx)
- 【报告分享】2020美妆行业短视频营销报告.pdf(附下载链接)
- java mysql 分页计算公式_关于Java的分页算法,急!
- cloudflare 关于tls 检测,发送未知message type字节
- 快速查找对方IP地址经典技巧汇总
- 云打印SDK来袭,支持飞鹅云,芯烨云,易联云,优声云等云打印机
- 没有配置任何软件的计算机上能够运行,禁止电脑安装任何软件
- 单元测试总结反思_单元测试反思300字
- Kubernetes -K8S安装部署及SpringCloud应用
- Python生成图文并茂PDF报告
- 您好!欢迎关注异贝!异贝是中国8000万中小微企业忠实的朋友,与您一起成长。异贝商学院今天与您分享:健身行业异贝引客、锁客方案设计!
- 淘宝特价版推出省心版,为什么难“钉“老人心?
- android白屏优化方案,优化Android App启动白屏
- PHP的ereg()与eregi()的不同及相同点。对比
- FristiLeaks_1.3#攻略