# 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 插件系统的大门
[](https://www.oracle.com/java/)
[](https://maven.apache.org/)
[](LICENSE)
[](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爱分享**(深度专栏,从零手写框架)
- 🔗 Gitee:[dongchenglin](https://gitee.com/dongchenglin)
---
## ⭐ 支持一下
如果这个项目对你有帮助,欢迎:
- ⭐ 给个 Star,让更多人看到
- 📤 分享给身边的 Java 小伙伴
- 📝 关注公众号 **Fox爱分享**,持续更新底层原理干货
- 🚀 加入知识星球 **Fox爱分享**,获取完整《Java古法编程》系列专栏
---
## 许可证
[MIT License](LICENSE)