# fox-spi-framework **Repository Path**: dongchenglin/fox-spi-framework ## Basic Information - **Project Name**: fox-spi-framework - **Description**: Java古法编程第3期:SPI 机制与类加载器 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-05-09 - **Last Updated**: 2026-05-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 🦊 fox-spi-framework 《Java古法编程》第3期「SPI 机制与类加载器」配套代码 > 从零手写 ServiceLoader,揭开 Java 插件系统的大门 [![Java](https://img.shields.io/badge/Java-17+-orange.svg)](https://www.oracle.com/java/) [![Maven](https://img.shields.io/badge/Maven-3.6+-blue.svg)](https://maven.apache.org/) [![License](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE) [![Gitee](https://img.shields.io/badge/Gitee-dongchenglin-red)](https://gitee.com/dongchenglin) --- ## 📖 配套专栏 > **《Java古法编程》** 是一套从零手写框架的实战专栏,用工程师视角拆底层原理 —— 不整虚的,只讲能用的。 - 📌 第1期:[从零手写 IoC 容器](https://gitee.com/dongchenglin/fox-ioc-framework) - 📌 第2期:[动态代理与 AOP](https://gitee.com/dongchenglin/fox-proxy-framework) - 📌 **第3期:SPI 机制与类加载器(本期)** ← 📍 你在这里 - 📌 第4期(预告):字节码插装与 Java Agent 👉 **完整专栏请关注 [知识星球 · Fox爱分享](https://t.zsxq.com/)** --- ## 项目结构 ``` fox-spi-framework/ ├── pom.xml └── src/ ├── main/ │ ├── java/com/fox/ │ │ ├── framework/ │ │ │ ├── api/ │ │ │ │ └── DataSource.java # SPI 接口(标准用法) │ │ │ ├── impl/ │ │ │ │ ├── MySQLDataSource.java # MySQL 实现 │ │ │ │ └── PostgreSQLDataSource.java # PostgreSQL 实现 │ │ │ └── Main.java # 第4章:标准 SPI 用法演示 │ │ ├── plugin/ │ │ │ ├── MessagePusher.java # 插件接口 │ │ │ ├── impl/ │ │ │ │ ├── DingTalkPusher.java # 钉钉插件实现 │ │ │ │ └── FeishuPusher.java # 飞书插件实现 │ │ │ └── NotificationService.java # 第7章:插件系统主程序 │ │ └── spi/ │ │ ├── FoxServiceLoader.java # 第5章:手写 ServiceLoader │ │ └── Main.java # 第5章:手写版演示 │ └── resources/ │ └── META-INF/services/ │ ├── com.fox.framework.api.DataSource │ └── com.fox.plugin.MessagePusher └── test/ └── java/ # 单元测试 ``` --- ## 🚀 快速运行 ### 前提 - JDK 17+ - Maven 3.6+ ### 运行标准 SPI 演示(第4章) ```bash cd fox-spi-framework mvn compile exec:java -Dexec.mainClass="com.fox.framework.Main" ``` **预期输出:** ``` 发现实现:MySQL 正在连接 MySQL 数据库... 发现实现:PostgreSQL 正在连接 PostgreSQL 数据库... ``` ### 运行手写 ServiceLoader 演示(第5章) ```bash mvn compile exec:java -Dexec.mainClass="com.fox.spi.Main" ``` **预期输出:** ``` 发现实现:MySQL 正在连接 MySQL 数据库... 发现实现:PostgreSQL 正在连接 PostgreSQL 数据库... ``` ### 运行插件系统演示(第7章) ```bash mvn compile exec:java -Dexec.mainClass="com.fox.plugin.NotificationService" ``` **预期输出:** ``` [钉钉] 推送消息:系统升级通知 [钉钉] 推送成功 [飞书] 推送消息:系统升级通知 [飞书] 推送成功 ``` --- ## 📚 核心知识点 | 文件 | 对应章节 | 知识点 | |------|---------|---------| | `DataSource.java` | 第四章 | SPI 标准接口定义 | | `META-INF/services/` 文件 | 第四章 | SPI 注册机制 | | `Main.java` (framework) | 第四章 | 标准 `ServiceLoader.load()` 用法 | | `FoxServiceLoader.java` | 第五章 | 从零手写 ServiceLoader | | `NotificationService.java` | 第七章 | SPI 插件系统实战 | | `DingTalkPusher.java` | 第七章 | 可插拔插件实现 | --- ## 💡 扩展练习 1. **新增数据源**:新增 `OracleDataSource`,只需新建类 + 在 SPI 文件加一行 2. **新增推送渠道**:新增企业微信 pusher,主程序零改动 3. **打破双亲委托**:自定义 ClassLoader,覆写 `loadClass()` 方法 4. **JDK 9+ 模块化**:为项目添加 `module-info.java` --- ## 🔗 相关链接 - 本专栏 Gitee 组织:[gitee.com/dongchenglin](https://gitee.com/dongchenglin) - 第1期配套代码:[fox-ioc-framework](https://gitee.com/dongchenglin/fox-ioc-framework) - 第2期配套代码:[fox-proxy-framework](https://gitee.com/dongchenglin/fox-proxy-framework) --- ## 💬 关于作者 > **Fox爱分享**,Java 后端工程师,专注框架底层原理与手写实现。 > > 相信「纸上得来终觉浅」,只有亲手写过,才真正懂。 - 📱 公众号:**Fox爱分享**(扫码关注,第一时间获取更新) 微信公众号 Fox爱分享 - 🌍 知识星球:**Fox爱分享**(深度专栏,从零手写框架) 知识星球 Fox爱分享 - 🔗 Gitee:[dongchenglin](https://gitee.com/dongchenglin) --- ## ⭐ 支持一下 如果这个项目对你有帮助,欢迎: - ⭐ 给个 Star,让更多人看到 - 📤 分享给身边的 Java 小伙伴 - 📝 关注公众号 **Fox爱分享**,持续更新底层原理干货 - 🚀 加入知识星球 **Fox爱分享**,获取完整《Java古法编程》系列专栏 --- ## 许可证 [MIT License](LICENSE)