AOP的核心概念(面向方面的编程)是基于不更改源代码的前提,该方法是通过图中所示的“水平切割”方法的“水平切割”方法。
一般而言,成熟的系统通常包含,但不限于以下6点的一般逻辑:
用AOP术语,我们将这些通用逻辑称为一个方面。想象一下,如果包含上述业务模块的共享代码充满了上述业务模块?显然,当依赖方更改时,它就无法有助于要维护程序中依赖关系的所有逻辑代码,这不利于维护。如果要解决此疼痛点,则必须从逻辑代码中剥离这些共享代码,以使其形成独立的模块,并应用它要在语句中进行特定的逻辑代码。为了消除程序中不必要的依赖性,请提高开发效率和重新组装代码。这是我们使用AOP的最初意图。
AOP与特定的实施技术无关。只要它与AOP一致,我们都可以称其为AOP.在目前,市场上AOP框架的实施方案通常基于以下两种形式:
在编译期间,静态的编织选择以将AOP插入目标类中的AOP增强逻辑。在运行期间以动态代理形式增强目标类的动态编织选择,例如CGLIB,Javassist,ASM和ASM和其他Bytecode Generating Generating Generating Generating Generating Generating Generating Generating Generating Generating Generating Generating Generating Generating Generating Generating Generating Generating Generating Generating Ode工具可用于支持该解决方案的实现。
动态编织技术首先,我们可以尝试在运行时是否动态更改类。
上面的代码我们删除基本base = new base();该行可以正常执行,但是在此行我们会看到以下错误。它表明不允许JVM在运行时动态加载类,也就是说,热量替换了类。
既然这条路不可用,还有其他方法吗?
幸运的是,从JDK1.5开始,Java的设计师提供了基于Java.lang.instrumen软件包的开发人员,根据仪器API为开发人员提供了基于Instrument-API的开发人员,该仪器API基于JVMTI(JAVA Virtual Machinial Alokal Interal Funterface,Machine Alokal Interface,Machine interface,forness-api)。Java虚拟机床界面)规范。它使其能够使用仪器来构建独立于应用程序的代理程序,以监视和协助在JVM上运行的程序,最重要的是,使用仪器可以修改并替换运行时的类定义。换句话说,这等同于我们可以动态增强目标类方法。
例如,ASM更加复杂,需要理解。Javassist的实现相对简单。
代理模块
POM文件
AgentMain Class.AgentMain是代理过程的输入方法。
增强的代理类别主要达到了一段时间。
该代理是由MVN ISNTALL命令由本地JAR软件包制成的。
字节码插入桩的目标类别和方法
MIAN运行底板的方法,您将看到一两秒钟的印刷运行一次。
代理附加代码,该代码的作用是在运行目标JVM进程的目标JVM过程中增强字节代码。
原始:https://juejin.cn/post/7099763315710099469