【alibaba/jvm-sandbox#02】通过无侵入AOP实现行为注入和流控

简介: 任何一个 Java 方法的调用都可以分解为`BEFORE`、`RETURN`和`THROWS`三个环节,由此在三个环节上引申出对应环节的事件探测和流程控制机制。
我是石页兄,朋友不因远而疏,高山不隔友谊情;偶遇美羊羊,我们互相鼓励

欢迎关注微信公众号「架构染色」交流和学习

一、alibaba/jvm-sandbox 概述

alibaba/jvm-sandbox 是 JVM 沙箱容器,一种 JVM 的非侵入式运行期 AOP 解决方案。沙箱容器提供

  1. 动态增强类你所指定的类,获取你想要的参数和行信息甚至改变方法执行
  2. 动态可插拔容器框架

在其能力至上构建的上层应用有:

二、实时无侵入 AOP 框架方案对比

在常见的 AOP 框架实现方案中,有静态编织和动态编织两种。

  1. 静态编织:静态编织发生在字节码生成时根据一定框架的规则提前将 AOP 字节码插入到目标类和方法中,实现 AOP;
  2. 动态编织:动态编织则允许在 JVM 运行过程中完成指定方法的 AOP 字节码增强.常见的动态编织方案大多采用重命名原有方法,再新建一个同签名的方法来做代理的工作模式来完成 AOP 的功能(常见的实现方案如 CgLib),但这种方式存在一些应用边界:

    • 侵入性:对被代理的目标类需要进行侵入式改造。比如:在 Spring 中必须是托管于 Spring 容器中的 Bean
    • 固化性:目标代理方法在启动之后即固化,无法重新对一个已有方法进行 AOP 增强

要解决无侵入的特性需要 AOP 框架具备  在运行时完成目标方法的增强和替换。在 JDK 的规范中运行期重定义一个类必须准循以下原则

  1. 不允许新增、修改和删除成员变量
  2. 不允许新增和删除方法
  3. 不允许修改方法签名

JVM-SANDBOX 属于基于 Instrumentation 的动态编织类的 AOP 框架,通过精心构造了字节码增强逻辑,使得沙箱的模块能在不违反 JDK 约束情况下实现对目标应用方法的无侵入运行时 AOP 拦截

三、基于事件的行为注入和流控

image.png

在沙箱的世界观中,任何一个 Java 方法的调用都可以分解为BEFORERETURNTHROWS三个环节,由此在三个环节上引申出对应环节的事件探测和流程控制机制。

// BEFORE
try {

   /*
    * do something...
    */

    // RETURN
    return;

} catch (Throwable cause) {
    // THROWS
}

基于BEFORERETURNTHROWS三个环节事件分离,沙箱的模块可以完成很多类 AOP 的操作。

  1. 可以感知和改变方法调用的入参
  2. 可以感知和改变方法调用返回值和抛出的异常
  3. 可以改变方法执行的流程

    • 在方法体执行之前直接返回自定义结果对象,原有方法代码将不会被执行
    • 在方法体返回之前重新构造新的结果对象,甚至可以改变为抛出异常
    • 在方法体抛出异常之后重新抛出新的异常,甚至可以改变为正常返回

image.png

四、最后说一句

我是石页兄,如果这篇文章对您有帮助,或者有所启发的话,欢迎关注笔者的微信公众号【 架构染色 】进行交流和学习。您的支持是我坚持写作最大的动力。

欢迎点击链接扫马儿关注、交流。

参考并感谢

相关文章
|
7月前
|
XML Java 数据格式
【Spring】全面讲解IOC、AOP、注入方式、bean的生命周期、aop通知应用 spring与web容器整合
Spring是一个开源的轻量级Java应用开发框架,它提供了一种简单、高效、灵活的方式来构建企业级应用程序。Spring框架的核心特点是依赖注入(Dependency Injection)和面向切面编程(Aspect-Oriented Programming),它通过一组模块化的组件提供全面的支持,使开发人员能够快速搭建可扩展、可维护的应用。
|
8月前
|
Java Spring
2021-08-09构造方法注入,项目搭建,通过注释注入,注解扫描器,spring,ioc结束,AOP(二)
2021-08-09构造方法注入,项目搭建,通过注释注入,注解扫描器,spring,ioc结束,AOP
164 0
|
8月前
|
Java Spring
2021-08-09构造方法注入,项目搭建,通过注释注入,注解扫描器,spring,ioc结束,AOP(一)
2021-08-09构造方法注入,项目搭建,通过注释注入,注解扫描器,spring,ioc结束,AOP
166 0
|
缓存 Java Spring
spring aop 注入源码解析
spring aop 注入源码解析
2153 0
|
存储 监控 Java
非侵入式AOP监控之——AspectJ使用
> 一引言 > 二什么是AspectJ > 2.1 它只是一个代码编译器 > 2.2 它是用来做AOP编程的 > 2.3为什么要用AspectJ > 三AspectJ原理与运用 > 3.1 基本原理 > 3.2 使用方式 > 3.2.1 纯注解方式 > 3.2.2 AspectJ语言 > 3.2.3 结合自定义注解使用 > 四 使用AspectJ进行监听方法执行耗时 > 五
8840 0
|
Spring Java
aop在Action拦截丢失注入解决
aop在Action拦截丢失注入解决 我和你遇到了同样的错误了,能了好长时间才发现,    在你的struts2文件里放入这个常量,这样就可以了,或者为你的service提供setter方法,大概意思是不论怎样,strutsw都要去考虑s...
529 0