当前位置: 首页 > 科技观察

面试官:说说你对SpringAOP的理解?请添加这些内容,绝对加分!

时间:2023-03-21 20:14:35 科技观察

介绍众所周知,一提到AOP,相信大家都会条件反射的想到JDKproxy和CGLibproxy。是的,这两个代理类是在runtime内存中临时生成的,所以也叫runtime。增强-动态代理。世界上的一切都不是绝对的。既然有动态代理,有没有想过有没有静态代理呢?LTW(LoadTimeWeaving)其实除了运行时编织切面的方式,我们还有一种编织切面的方式。它可以在类加载期间转换字节码,然后将目标编织到入口点(目标类)中,这种方法是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[],表示转换后的字节码,但如果返回为空,则表示没有section进行了代码转换处理,不能视为清除了原类的字节码。Instrumentation接口提供了很多方法,我们主要关注一个方法,即:addTransformer方法,它的作用是在JVM内部注册一些ClassFileTransformer,接口如图:具体工作原理如下:①ClassFileTransformer实例注册到JVM后,JVM加载Class文件时,会先调用ClassFileTransformer的transform()方法进行字节码转换;②如果注册了多个ClassFileTransformer实例,则按照注册的先后顺序调用一次。这样就从JVM层面截取了字节码,然后将运营商想要添加的逻辑织入其中,即实现了AOP效果。代码和演示效果说了这么多,下面来点干货。下面的代码将向您展示如何向JVM注册转换器以实现AOP。为了方便大家阅读,作者在代码的注释或者图片空白处写了重要的说明,请注意查看。首先,我们实现一个自己的转换器来模拟需要切入的函数。再次注意,这里代码中的returnnull并没有清空加载类的字节码。其次,我们为什么要在代理类中实现一个代理类,因为它不是动态代理。..最后,我们写了一个main函数,也就是说程序的入口到这里就结束了,我们的Demo就算完成了。来看看运行结果:开罐需要注意什么可以看到执行结果截图,cmd界面下运行javaagent参数时指定了一个myTransformer.jar。这个jar就是我们需要打出来的。你可以直接使用eclipse。动态代理方便,连转换器都可能影响JVM的所有类。更新操作比较麻烦,在实际生产部署中会有很多不便。不过,写这些是为了让大家更好、更多地理解AOP。我们熟悉的AOP其实有很多值得我们自己学习和发现的地方。其实Spring在“操作麻烦”方面还是做得很多的。就是提供一些xml配置管理的东西(这里就不说了,因为我觉得说来话长,有兴趣的可以自己去看看,写的多了解一点也无妨)事物)。很多情况下不需要再配置javaagent参数了。最后,如果在面试中提到这些,相信面试官也会得到加分。