当前位置: 首页 > article >正文

Spring代理工厂类ProxyFactory作用以及实现原理

代理工厂类ProxyFactory

      • `AdvisedSupport`(代理配置信息类)
      • `ProxyFactory`(代理工厂类)
      • 小结
      • 测试

源码见:mini-spring

在这里插入图片描述

在 AOP(面向切面编程)中,Spring 支持两种常见的代理机制:基于接口的 JDK 动态代理 和 基于字节码生成的 CGLIB 动态代理。而 代理工厂(ProxyFactory)的引入,正是为了解决硬编码选择代理方式的问题,通过统一的封装,自动选择最合适的代理实现方式。

为了支持自动判断使用哪种代理方式,我们需要在代理配置信息中引入一个开关字段:

AdvisedSupport(代理配置信息类)

// 是否强制使用 CGLIB 代理(即代理目标类本身,而不是接口)
private boolean proxyTargetClass = false;

这个字段是判断使用 JDK 还是 CGLIB 的关键标识。

ProxyFactory(代理工厂类)

/*** 代理工厂类* * 用于根据配置生成对应的 AOP 代理对象。* 支持两种代理方式:*   - JDK 动态代理(适用于目标类实现了接口)*   - CGLIB 动态代理(适用于目标类未实现接口,或需要代理类本身)* * @author jixu* @date 2025/5/24*/
public class ProxyFactory {// 封装了代理配置(切点、拦截器、目标对象等)private final AdvisedSupper advisedSupper;/*** 构造方法* * @param advisedSupper 配置信息容器*/public ProxyFactory(AdvisedSupper advisedSupper) {this.advisedSupper = advisedSupper;}/*** 获取代理对象* * @return 生成的代理对象(JDK 或 CGLIB)*/public Object getProxy() {return createAopProxy().getProxy();}/*** 创建 AOP 代理对象* * 根据配置决定使用 JDK 动态代理还是 CGLIB 代理。* * @return AopProxy 实现类*/public AopProxy createAopProxy() {if (advisedSupper.isProxyTargetClass()) {// 需要代理类本身,使用 CGLIBreturn new CglibDynamicAopProxy(advisedSupper);}// 默认使用 JDK 动态代理return new JdkDynamicAopProxy(advisedSupper);}
}

小结

  • ProxyFactory 封装了代理选择逻辑,避免手动 new 代理方式。

  • AdvisedSupper 是代理配置的核心容器。

  • proxyTargetClass = true ⇒ 使用 CGLIB(代理目标类本身)

  • 否则 ⇒ 使用 JDK 动态代理(基于接口)

测试

@Test  
public void testProxyFactory(){  advisedSupper.setProxyTargetClass(true);  ProxyFactory proxyFactory = new ProxyFactory(advisedSupper);  WorldService worldService = (WorldService) proxyFactory.getProxy();  worldService.sayHello();  }
http://www.lryc.cn/news/2397655.html

相关文章:

  • SpringBoot使用MQTT协议简述
  • 【GraphQL】深入解析 Apollo Client:从架构到实践的一站式 GraphQL 解决方案
  • 集成电路制造设备防震基座选型指南:为稳定护航-江苏泊苏系统集成有限公司
  • 华为OD机试真题——阿里巴巴找黄金宝箱(II)(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现
  • Vue中 toRaw 和 markRaw 的使用
  • 探索DeepSeek提示词:关键策略与实用场景
  • 海底三维可视化平台
  • Elasticsearch 读写流程深度解析
  • AIoT赋能场馆数字化转型:智能管理新生态
  • 1、Pytorch介绍与安装
  • 【从零开始学习QT】Qt 概述
  • 家庭路由器改装,搭建openwrt旁路由以及手机存储服务器,实现外网节点转发、内网穿透、远程存储、接入满血DeepSeek方案
  • 人工智能工程技术专业 和 其他信息技术专业 有哪些关联性?
  • 基于本地模型+多级校验设计的高效缓存,有效节省token数量(有点鸡肋doge)。
  • 逐步检索增强推理的跨知识库路由学习
  • 用Git管理你的服务器配置文件与自动化脚本:版本控制、变更追溯、团队协作与安全回滚的运维之道
  • 【数据库】关系数据库标准语言-SQL(金仓)下
  • Vue3+SpringBoot全栈开发:从零实现增删改查与分页功能
  • 小黑大语言模型应用探索:langchain智能体构造源码demo搭建1(初步流程)
  • 极客时间:用 FAISS、LangChain 和 Google Colab 模拟 LLM 的短期与长期记忆
  • leetcode hot100刷题日记——35.子集
  • MybatisPlus(含自定义SQL、@RequiredArgsConstructor、静态工具类Db)
  • React 组件异常捕获机制详解
  • 手眼标定:九点标定、十二点标定、OpenCV 手眼标定
  • [总结]前端性能指标分析、性能监控与分析、Lighthouse性能评分分析
  • React-native的新架构
  • 【Android】MT6835 + MT6631 WiFi进入Meta模式出现WiFi_HQA_OpenAdapter failed
  • Git 全平台安装指南:从 Linux 到 Windows 的详细教程
  • Tree 树形组件封装
  • AI书签管理工具开发全记录(五):后端服务搭建与API实现