Solon2 开发之容器,八、动态代理的本质

embedded/2024/10/17 13:42:06/

在 Java 里动态代理,主要分:接口动态代理 和 类动态代理。因为它的代理类都是动态创建的,所以名字里会带上 “动态”。

官网的有些地方叫 “代理”,也有些地方叫 “动态代理”。都是一个意思。

1、接口动态代理

这是 jdk 直接支持的能力。内在的原理是:框架会动态生成目标接口的一个代理类(即接口的实现类)并返回,使用者在调用接口的函数时,实际上调用的是这个代理类的函数,而代理类又把数据转给了调用处理器接口。

而整个过程的感受是调用目标接口,最终到了 InvocationHandler 的实现类上:

//1. 定义目标接口
public interface UserService{void addUser(int userId, String userName);
}//=>//2. 通过JDK接口,获得一个代理实例
UserService userService = Proxy.getProxy(UserService.class, new InvocationHandlerImpl());//生成的 UserService 代理类,差不多是这个样子:
public class UserService$Proxy implements UserService{final InvocationHandler handler;final Method addUser2; //示意一下,别太计较它哪来的public UserService$Proxy(InvocationHandler handler){this.handler = handler;}@Overridepublic void void addUser(int userId, String userName){handler.invoke(this, addUser2, new Object[](userId, userName));}
}//在调用 userService 时,本质是调用 UserService$Proxy 的函数,最终又是转发到 InvocationHandler 的实现类上。//=>//3. 实现调用处理器接口public class InvocationHandlerImpl implements InvocationHandler{public Object invoke(Object proxy, Method method, Object[] args) throws Throwable{//...}
}

<mark> 一般,接口动态代理是为了:转发处理。</mark>

2、类动态代理

类的动态代理,略麻烦些,且要借助字符码工具框架(Solon 用的是 ASM)。内在的原理倒是相差不大:框架会动态生成目标类的一个代理类(一个重写了所有函数的子类)并返回,使用者在调用目标类的函数时,实际上调用的是这个代理类的函数,而代理类又把数据转给了调用处理器接口。调用处理器在处理时,会附加上别的处理。

而整个过程的感受是调用目标类,可以附加上很多拦截处理:

//1. 定义目标类
public class UserService{public void addUser(int userId, String userName){//..}
}//=>//2. 通过框架接口,获得一个代理实例(::注意这里的区别!) 
UserService userService = new UserService();
userService = AsmProxy.getProxy(UserService.class, new AsmInvocationHandlerImpl(userService));//生成的 UserService 代理类,差不多是这个样子:
public class UserService$AsmProxy extends UserService{final AsmInvocationHandler handler;final Method addUser2; //示意一下,别太计较它哪来的public UserService$Proxy(AsmInvocationHandler handler){this.handler = handler;}@Overridepublic void void addUser(int userId, String userName){handler.invoke(this, addUser2, new Object[](userId, userName));}
}//本质还是调用 UserService$AsmProxy 的函数,最终也是转发到 AsmInvocationHandler 的实现类上。//=>//3. 实现调用处理器接口public class AsmInvocationHandlerImpl implements AsmInvocationHandler{//::注意这里的区别final Object target;public AsmInvocationHandlerImpl(Object target){this.target = target;}public Object invoke(Object proxy, Method method, Object[] args) throws Throwable{//::注意这里的区别MethodWrap methodWrap = MethodWrap.get(method);//MethodWrap 内部对各种拦截器做了封装处理methodWrap.invoke(target, args);}
}

<mark> 一般,类动态代理是为了:拦截并附加处理。</mark>

3、关于 Solon 的类代理情况与 “函数环绕拦截”


对 Solon 来讲,只有一个函数反射后再经 MethodWrap 执行的,就是被代理了。所有的 “函数环绕拦截” 处理就封装在 MethodWrap 里面。

@Controller、@Remoting 注解的类
这两个注解类,没有 ASM 的类代码,但是它们的 Method 会转为 MethodWrap ,并包装成 Action 注册到路由器。即它们是经 MethodWrap 再调用的。所以它们有代理能力,支持 “函数环绕拦截”。

@Service、@Dao、@Repository 注解的类
这三个注解,来自 solon.aspect 插件包,它们注解的类,都会被 ASM 代理。跟上面原理分析的一样,也支持 “函数环绕拦截”。

  • 有克制的拦截

Solon 不支持表达式的随意拦截,必须以注解为 “切点” 进行显示拦截。<mark > 所以 Solon 不用为所有的 Bean 增加代理能力,按需添加即可 </mark>。


http://www.ppmy.cn/embedded/128178.html

相关文章

GCC(GNU Compiler Collection)部分参数解释

GCC&#xff08;GNU Compiler Collection&#xff09;部分参数解释 汇编器&#xff08;assembler&#xff09;、预处理器&#xff08;preprocessor&#xff09;和链接器&#xff08;linker&#xff09;。每个选项都允许你以逗号分隔的形式指定一个或多个参数&#xff0c;这些参…

什么是网络安全?网络安全包括哪几个方面?学完能做一名黑客吗?

提及网络安全&#xff0c;很多人都是既熟悉又陌生&#xff0c;所谓的熟悉就是知道网络安全可以保障网络服务不中断。那么到底什么是网络安全?网络安全包括哪几个方面?通过下文为大家介绍一下。 一、什么是网络安全? 网络安全是指保护网络系统、硬件、软件以及其中的数据免…

第八课:Python学习之循环

循环 目标 程序的三大流程while 循环基本使用break 和 continuewhile 循环嵌套 01. 程序的三大流程 在程序开发中&#xff0c;一共有三种流程方式&#xff1a; 顺序 —— 从上向下&#xff0c;顺序执行代码分支 —— 根据条件判断&#xff0c;决定执行代码的 分支循环 —— …

手撕单例模式

在Go语言中实现单例模式&#xff0c;通常需要确保一个类只有一个实例&#xff0c;并且提供一个全局访问点。Go语言本身没有类的概念&#xff0c;但可以通过结构体和函数来模拟这种行为。下面是一个简单的手撕单例模式的实现示例&#xff1a; 懒汉式&#xff08;延迟初始化&…

Postman使用-基础篇

前言 本教程将结合业界广为推崇和使用的RestAPI设计典范Github API&#xff0c;详细介绍Postman接口测试工具的使用方法和实战技巧。 在开始这个教程之前&#xff0c;先聊一下为什么接口测试在现软件行业如此重要&#xff1f; 为什么我们要学习Postman&#xff1f; 现代软件…

【python】OpenCV—Fourier Transform

文章目录 1、傅里叶变换1.1、振幅信息——abs1.2、相位信息——angle 2、傅里叶逆变换2.1、仅包含振幅或者仅包含相位 vs 振幅相位均包含2.2、两张图片振幅和相位互换 3、滤波3.1、高通滤波3.2、低通滤波3.3、带通滤波 4、涉及到的库函数4.1、numpy.fft.fft24.2、numpy.fft.fft…

使用verilog设计实现FPGA实现的图像直方图均衡化及其仿真

以下是一个使用Verilog实现图像直方图均衡化的基本框架。 ## 一、图像直方图均衡化原理 1. 首先计算图像的直方图,即统计每个灰度值出现的频率。 2. 然后根据直方图计算累积分布函数(CDF)。 3. 最后根据CDF对每个像素的灰度值进行重新映射,以实现直方图均衡化,增强图像对…

Vulnhub靶场案例渗透[7]- DC7

文章目录 1. 靶场搭建2. 信息收集2.1 确定靶机ip2.2 服务信息收集2.3 社工信息收集 3. 提权 1. 靶场搭建 靶场源地址 检验下载文件的检验码&#xff0c;对比没问题使用vmware打开 # windwos 命令 Get-FileHash <filePath> -Algorithm MD5 # linux md5sum filepath2. 信…