news 2026/9/8 6:21:07

Solon2 开发深入:容器与动态代理的奥秘

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Solon2 开发深入:容器与动态代理的奥秘

在 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; } @Override public 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; } @Override public 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>。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/1 7:14:57

Autoresearch成本实战:1293个实验烧掉779M tokens的经验与排查指南

Autoresearch 这类自动研究任务&#xff0c;最让人兴奋的是“一句话需求变成一批实验”&#xff0c;最让人头疼的是 token 像水一样烧。最近我在 GPUMode 下跑完了第三轮自动研究批次&#xff0c;累计 1293 个实验&#xff0c;消耗 779M tokens。先给结论&#xff1a;它适合做广…

作者头像 李华
网站建设 2026/8/31 2:33:45

工业时序预测落地实践:LSTM端到端代码与数据预处理关键细节

简介&#xff1a;时序预测是时间序列分析的核心任务&#xff0c;其本质是利用历史观测值建模动态演化规律。在工业物联网、设备运维和智能能源等场景中&#xff0c;预测模型的实用性远不止于算法选择&#xff0c;更取决于数据质量、特征构造与业务闭环能力。真实场景下&#xf…

作者头像 李华
网站建设 2026/9/2 7:56:10

C++ STL algorithm库深度解析:从泛型编程到高效算法实践

1. 项目概述&#xff1a;为什么你需要深入了解<algorithm>如果你正在用 C 写代码&#xff0c;无论是刷算法题、做项目&#xff0c;还是处理日常的数据任务&#xff0c;有一个头文件你几乎无法绕开&#xff0c;那就是<algorithm>。它就像是 C 标准库&#xff08;STL…

作者头像 李华
网站建设 2026/9/2 11:01:07

STM32两轮差速小车开环控制:从PWM原理到工程实践

1. 项目概述与核心价值 最近在整理工作室的物料&#xff0c;翻出来一堆之前做智能小车剩下的电机、轮子和几块STM32F103的开发板。看着这些零件&#xff0c;我突然想到&#xff0c;很多朋友在入门嵌入式开发时&#xff0c;总觉得第一步就卡在了“闭环控制”、“PID算法”这些听…

作者头像 李华
网站建设 2026/9/2 8:54:34

DigitalPlat FreeDomain 免费域名注册指南:5 个后缀从接入到维护

DigitalPlat FreeDomain 免费域名注册指南&#xff1a;5 个后缀从接入到维护 【免费下载链接】US.KG Free domain registration and practical DNS learning resources for everyone. 项目地址: https://gitcode.com/GitHub_Trending/us/US.KG DigitalPlat FreeDomain 是…

作者头像 李华
网站建设 2026/9/2 8:12:29

深度强化学习驱动的PID自适应调谐方法

简介&#xff1a;PID控制器是工业控制与飞控系统中最基础、最广泛使用的反馈控制结构&#xff0c;其性能高度依赖于Kp、Ki、Kd三个参数的整定。然而传统手动或规则式调参难以应对非线性、时变及多工况环境&#xff0c;导致响应迟滞、超调振荡或鲁棒性下降。深度强化学习&#x…

作者头像 李华