{"id":24397957,"url":"https://github.com/pansonpanson/moirai","last_synced_at":"2025-12-27T18:48:21.874Z","repository":{"id":277131393,"uuid":"915199172","full_name":"PansonPanson/moirai","owner":"PansonPanson","description":"从零开始写动态线程池框架","archived":false,"fork":false,"pushed_at":"2025-03-07T10:43:49.000Z","size":149,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-07T11:26:25.732Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/PansonPanson.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2025-01-11T08:15:16.000Z","updated_at":"2025-03-07T10:43:52.000Z","dependencies_parsed_at":null,"dependency_job_id":"5ad71c22-690b-49e9-83fd-481bb87c38ba","html_url":"https://github.com/PansonPanson/moirai","commit_stats":null,"previous_names":["pansonpanson/moirai"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PansonPanson%2Fmoirai","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PansonPanson%2Fmoirai/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PansonPanson%2Fmoirai/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PansonPanson%2Fmoirai/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/PansonPanson","download_url":"https://codeload.github.com/PansonPanson/moirai/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243351847,"owners_count":20276910,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-01-19T22:50:37.918Z","updated_at":"2025-12-27T18:48:21.867Z","avatar_url":"https://github.com/PansonPanson.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Moirai\nMoirai 是一个参考 Hippo4j 写的动态线程池框架，核心逻辑与 Hippo4j 一致，主要用于个人学习，在亲手造轮子中学习 Hippo4j 源码，以及学习动态线程池的设计原理与编码实践。\n\n除了框架本身以外，本仓库还较为系统性整理了动态线程池相关的知识，欢迎交流。\n\n### 如何设计一个动态线程池框架？\n+ [明确监控的线程池信息（直接读取的核心参数、加工后的数据）.md](doc/%E6%98%8E%E7%A1%AE%E7%9B%91%E6%8E%A7%E7%9A%84%E7%BA%BF%E7%A8%8B%E6%B1%A0%E4%BF%A1%E6%81%AF%EF%BC%88%E7%9B%B4%E6%8E%A5%E8%AF%BB%E5%8F%96%E7%9A%84%E6%A0%B8%E5%BF%83%E5%8F%82%E6%95%B0%E3%80%81%E5%8A%A0%E5%B7%A5%E5%90%8E%E7%9A%84%E6%95%B0%E6%8D%AE%EF%BC%89.md)\n+ [明确可以动态更新的线程池信息.md](doc/%E6%98%8E%E7%A1%AE%E5%8F%AF%E4%BB%A5%E5%8A%A8%E6%80%81%E6%9B%B4%E6%96%B0%E7%9A%84%E7%BA%BF%E7%A8%8B%E6%B1%A0%E4%BF%A1%E6%81%AF.md)\n+ [自定义可变容量的阻塞队列.md](doc/%E8%87%AA%E5%AE%9A%E4%B9%89%E5%8F%AF%E5%8F%98%E5%AE%B9%E9%87%8F%E7%9A%84%E9%98%BB%E5%A1%9E%E9%98%9F%E5%88%97.md)\n+ [动态线程池的扩展点以及插件体系.md](doc/%E5%8A%A8%E6%80%81%E7%BA%BF%E7%A8%8B%E6%B1%A0%E7%9A%84%E6%89%A9%E5%B1%95%E7%82%B9%E4%BB%A5%E5%8F%8A%E6%8F%92%E4%BB%B6%E4%BD%93%E7%B3%BB.md)\n+ [提供默认插件注册功能.md](doc/%E6%8F%90%E4%BE%9B%E9%BB%98%E8%AE%A4%E6%8F%92%E4%BB%B6%E6%B3%A8%E5%86%8C%E5%8A%9F%E8%83%BD.md)\n+ [使用 Builder 模式构建动态线程池.md](doc/%E4%BD%BF%E7%94%A8%20Builder%20%E6%A8%A1%E5%BC%8F%E6%9E%84%E5%BB%BA%E5%8A%A8%E6%80%81%E7%BA%BF%E7%A8%8B%E6%B1%A0.md)\n+ [线程池配置信息注册到服务端.md](doc/%E7%BA%BF%E7%A8%8B%E6%B1%A0%E9%85%8D%E7%BD%AE%E4%BF%A1%E6%81%AF%E6%98%AF%E5%A6%82%E4%BD%95%E6%B3%A8%E5%86%8C%E5%88%B0%E6%9C%8D%E5%8A%A1%E7%AB%AF%E7%9A%84%3F.md)\n+ [适配 TTL 和 Spring ThreadPoolTaskExecutor.md](doc/%E9%80%82%E9%85%8D%20TTL%20%E5%92%8C%20Spring%20ThreadPoolTaskExecutor.md)\n+ [实现客户端与服务端之间的服务发现.md](doc/%E5%AE%9E%E7%8E%B0%E5%AE%A2%E6%88%B7%E7%AB%AF%E4%B8%8E%E6%9C%8D%E5%8A%A1%E7%AB%AF%E4%B9%8B%E9%97%B4%E7%9A%84%E6%9C%8D%E5%8A%A1%E5%8F%91%E7%8E%B0.md)\n+ [实现客户端与服务端之间的心跳检测（续约）.md](doc/%E5%AE%9E%E7%8E%B0%E5%AE%A2%E6%88%B7%E7%AB%AF%E4%B8%8E%E6%9C%8D%E5%8A%A1%E7%AB%AF%E4%B9%8B%E9%97%B4%E7%9A%84%E5%BF%83%E8%B7%B3%E6%A3%80%E6%B5%8B%EF%BC%88%E7%BB%AD%E7%BA%A6%EF%BC%89.md)\n+ [实现过期服务移除功能.md](doc/%E5%AE%9E%E7%8E%B0%E8%BF%87%E6%9C%9F%E6%9C%8D%E5%8A%A1%E7%A7%BB%E9%99%A4%E5%8A%9F%E8%83%BD.md)\n+ [使用长轮询实现配置信息的动态变更.md](doc/%E4%BD%BF%E7%94%A8%E9%95%BF%E8%BD%AE%E8%AF%A2%E5%AE%9E%E7%8E%B0%E9%85%8D%E7%BD%AE%E4%BF%A1%E6%81%AF%E7%9A%84%E5%8A%A8%E6%80%81%E5%8F%98%E6%9B%B4.md)\n+ ……\n\n## 一、模块依赖关系\n### moirai-server-bootstrap maven 依赖关系（project module）\n\n```\nmoirai-server-bootstrap \n└── moirai-server-console \n    ├── moirai-server-config\n    │   ├── moirai-common \n    │   └── moirai-adapter \n    │       └── moirai-core \n    │           └── moirai-server-monitor-base \n    ├── moirai-server-discovery \n    └── moirai-server-auth \n```\n\n\n1. 根节点是 `moirai-server-bootstrap`\n2. 直接依赖是 `moirai-server-console`（编译作用域）\n3. 二级依赖包含三个模块： \n   - 配置模块 `moirai-server-config`\n   - 服务发现模块 `moirai-server-discovery`\n   - 认证模块 `moirai-server-auth`\n4. 配置模块延伸出基础技术栈：\n   - 公共模块 → 适配器 → 核心模块 → 监控基础模块\n\n\n```mermaid\ngraph TD\n    A[moirai-server-bootstrap] --\u003e B[moirai-server-console]\n    B --\u003e C[moirai-server-config]\n    B --\u003e D[moirai-server-discovery]\n    B --\u003e E[moirai-server-auth]\n    C --\u003e F[moirai-common]\n    C --\u003e G[moirai-adapter]\n    G --\u003e H[moirai-core]\n    H --\u003e I[moirai-server-monitor-base]\n```\n\n\n### moirai-example maven 依赖关系（project module）\n依赖关系图：\n\n```mermaid\ngraph TD\n    A[moirai-example] --\u003e B[moirai-spring-boot-starter]\n    B --\u003e C[moirai-core]\n    C --\u003e D[moirai-common]\n    B --\u003e E[moirai-server-monitor-base]\n    B --\u003e F[moirai-adapter]\n    B --\u003e G[moirai-message]\n```\n\n\n**层级结构**：\n    - Level 0: 根模块 `moirai-example`\n    - Level 1: 核心依赖 `moirai-spring-boot-starter`\n    - Level 2: Starter 的四个直接子模块\n    - Level 3: `moirai-core` 的唯一子模块 `moirai-common`\n\n## 二、插件体系\n\n```mermaid\nclassDiagram\ndirection BT\nclass AbstractTaskTimerPlugin {\n  + AbstractTaskTimerPlugin() \n  + beforeExecute(Thread, Runnable) void\n  # currentTime() long\n  # processTaskTime(long) void\n  + afterExecute(Runnable, Throwable) void\n}\nclass ExecuteAwarePlugin {\n\u003c\u003cInterface\u003e\u003e\n  + beforeExecute(Thread, Runnable) void\n  + afterExecute(Runnable, Throwable) void\n}\nclass RejectedAwarePlugin {\n\u003c\u003cInterface\u003e\u003e\n  + beforeRejectedExecution(Runnable, ThreadPoolExecutor) void\n}\nclass ShutdownAwarePlugin {\n\u003c\u003cInterface\u003e\u003e\n  + afterShutdown(ThreadPoolExecutor, List~Runnable~) void\n  + afterTerminated(ExtensibleThreadPoolExecutor) void\n  + beforeShutdown(ThreadPoolExecutor) void\n}\nclass Summary {\n  + Summary(long, long, long, long) \n  - long taskCount\n  - long minTaskTimeMillis\n  - long totalTaskTimeMillis\n  - long maxTaskTimeMillis\n   long maxTaskTimeMillis\n   long taskCount\n   long minTaskTimeMillis\n   long totalTaskTimeMillis\n   long avgTaskTimeMillis\n}\nclass TaskAwarePlugin {\n\u003c\u003cInterface\u003e\u003e\n  + beforeTaskCreate(ThreadPoolExecutor, Runnable, V) Runnable\n  + beforeTaskCreate(ThreadPoolExecutor, Callable~V~) Callable~V~\n  + beforeTaskExecute(Runnable) Runnable\n}\nclass TaskDecoratorPlugin {\n  + TaskDecoratorPlugin() \n  - List~TaskDecorator~ decorators\n  + removeDecorator(TaskDecorator) void\n  + clearDecorators() void\n  + beforeTaskExecute(Runnable) Runnable\n  + addDecorator(TaskDecorator) void\n   PluginRuntime pluginRuntime\n   String id\n   List~TaskDecorator~ decorators\n}\nclass TaskRejectCountRecordPlugin {\n  + TaskRejectCountRecordPlugin() \n  - AtomicLong rejectCount\n  + beforeRejectedExecution(Runnable, ThreadPoolExecutor) void\n   PluginRuntime pluginRuntime\n   Long rejectCountNum\n   AtomicLong rejectCount\n   String id\n}\nclass TaskRejectNotifyAlarmPlugin {\n  + TaskRejectNotifyAlarmPlugin() \n  + beforeRejectedExecution(Runnable, ThreadPoolExecutor) void\n   String id\n}\nclass TaskTimeRecordPlugin {\n  + TaskTimeRecordPlugin() \n  + summarize() Summary\n  # processTaskTime(long) void\n   PluginRuntime pluginRuntime\n   String id\n}\nclass TaskTimeoutNotifyAlarmPlugin {\n  + TaskTimeoutNotifyAlarmPlugin(String, Long, ThreadPoolExecutor) \n  - Long executeTimeOut\n  # processTaskTime(long) void\n   String id\n   Long executeTimeOut\n}\nclass ThreadPoolExecutorShutdownPlugin {\n  + ThreadPoolExecutorShutdownPlugin(long) \n  + long awaitTerminationMillis\n  - awaitTerminationIfNecessary(ExtensibleThreadPoolExecutor) void\n  + beforeShutdown(ThreadPoolExecutor) void\n  # cancelRemainingTask(Runnable) void\n  + afterShutdown(ThreadPoolExecutor, List~Runnable~) void\n   PluginRuntime pluginRuntime\n   String id\n   long awaitTerminationMillis\n}\nclass ThreadPoolPlugin {\n\u003c\u003cInterface\u003e\u003e\n  + start() void\n  + stop() void\n   PluginRuntime pluginRuntime\n   String id\n}\n\nAbstractTaskTimerPlugin  ..\u003e  ExecuteAwarePlugin \nExecuteAwarePlugin  --\u003e  ThreadPoolPlugin \nRejectedAwarePlugin  --\u003e  ThreadPoolPlugin \nShutdownAwarePlugin  --\u003e  ThreadPoolPlugin \nTaskTimeRecordPlugin  --\u003e  Summary \nTaskAwarePlugin  --\u003e  ThreadPoolPlugin \nTaskDecoratorPlugin  ..\u003e  TaskAwarePlugin \nTaskRejectCountRecordPlugin  ..\u003e  RejectedAwarePlugin \nTaskRejectNotifyAlarmPlugin  ..\u003e  RejectedAwarePlugin \nTaskTimeRecordPlugin  --\u003e  AbstractTaskTimerPlugin \nTaskTimeoutNotifyAlarmPlugin  --\u003e  AbstractTaskTimerPlugin \nThreadPoolExecutorShutdownPlugin  ..\u003e  ShutdownAwarePlugin \n\n```\n\n\n## 三、线程池配置信息是如何注册到服务端的?\n\n```mermaid\ngraph TD\nA[开始: postProcessAfterInitialization] --\u003e B{Bean是DynamicThreadPoolExecutor\u003cbr/\u003e或适配器匹配?}\nB --\u003e|是| C{检查DynamicThreadPool注解}\nB --\u003e|否| D{Bean是DynamicThreadPoolWrapper?}\nD --\u003e|是| E[调用registerAndSubscribe]\nD --\u003e|否| Z[返回bean]\n\n    C --\u003e|找到注解| F[提取DynamicThreadPoolExecutor实例]\n    C --\u003e|未找到注解| Z\n    \n    F --\u003e G[创建DynamicThreadPoolWrapper]\n    G --\u003e H[调用fillPoolAndRegister]\n    \n    subgraph fillPoolAndRegister流程\n        H --\u003e I[构建查询参数]\n        I --\u003e J[HTTP GET查询服务端配置]\n        J --\u003e K{服务端存在配置?}\n        K --\u003e|是| L[更新本地线程池参数]\n        K --\u003e|否| M[构建DynamicThreadPoolRegisterParameter]\n        L --\u003e N[注册到GlobalThreadPoolManage]\n        M --\u003e O[调用GlobalThreadPoolManage.dynamicRegister]\n        O --\u003e P[触发DynamicThreadPoolConfigService注册]\n        P --\u003e Q[HTTP POST注册到服务端]\n        Q --\u003e R{注册成功?}\n        R --\u003e|是| S[缓存告警配置]\n        R --\u003e|否| T[记录错误日志]\n        S --\u003e N\n    end\n    \n    H --\u003e U[替换第三方线程池执行器]\n    U --\u003e V[订阅配置更新]\n    V --\u003e W[返回处理后的bean]\n    \n    E --\u003e X[调用registerAndSubscribe]\n    X --\u003e Y[同fillPoolAndRegister流程]\n    \n    subgraph GlobalThreadPoolManage\n        N --\u003e AA[存入EXECUTOR_MAP]\n        N --\u003e AB[存入POOL_PARAMETER]\n    end\n    \n    subgraph DynamicThreadPoolConfigService\n        P --\u003e BA[参数校验]\n        BA --\u003e BB[填充租户/项目信息]\n        BB --\u003e BC[发送HTTP请求]\n        BC --\u003e BD[处理告警配置]\n    end\n    \n    style A fill:#f9f,stroke:#333\n    style Z fill:#f9f,stroke:#333\n    style H fill:#bbf,stroke:#666\n    style N fill:#bfb,stroke:#666\n    style P fill:#fbb,stroke:#666\n    \n```\n\n\n## 四、目录\n\n\n\n### 线程池相关\n+ [为什么Java要设计一个线程池？](https://github.com/PansonPanson/moirai/blob/main/doc/001_Java%E4%B8%BA%E4%BB%80%E4%B9%88%E8%A6%81%E8%AE%BE%E8%AE%A1%E7%BA%BF%E7%A8%8B%E6%B1%A0%EF%BC%9F.md)\n+ [万字长文之线程池源码深入分析](https://github.com/PansonPanson/moirai/blob/main/doc/002_%E7%BA%BF%E7%A8%8B%E6%B1%A0%E6%BA%90%E7%A0%81%E6%B7%B1%E5%85%A5%E5%88%86%E6%9E%90.md)\n+ [线程池源码涉及到的位运算以及相应算法练习](https://github.com/PansonPanson/moirai/blob/main/doc/%E7%BA%BF%E7%A8%8B%E6%B1%A0%E6%BA%90%E7%A0%81%E6%B6%89%E5%8F%8A%E5%88%B0%E7%9A%84%E4%BD%8D%E8%BF%90%E7%AE%97%E4%BB%A5%E5%8F%8A%E7%9B%B8%E5%BA%94%E7%AE%97%E6%B3%95%E7%BB%83%E4%B9%A0.md) \n+ [线程池源码涉及到的链表结构以及相应算法练习](https://github.com/PansonPanson/moirai/blob/main/doc/%E7%BA%BF%E7%A8%8B%E6%B1%A0%E6%BA%90%E7%A0%81%E6%B6%89%E5%8F%8A%E5%88%B0%E7%9A%84%E9%93%BE%E8%A1%A8%E7%BB%93%E6%9E%84%E4%BB%A5%E5%8F%8A%E7%9B%B8%E5%BA%94%E7%AE%97%E6%B3%95%E7%BB%83%E4%B9%A0.md)\n+ [LinkedBlockingQueue 原理与源码深度分析](https://github.com/PansonPanson/moirai/blob/main/doc/LinkedBlockingQueue%20%E5%8E%9F%E7%90%86%E4%B8%8E%E6%BA%90%E7%A0%81%E6%B7%B1%E5%BA%A6%E5%88%86%E6%9E%90.md)\n+ [核心线程数为0时，线程池如何执行？](https://github.com/PansonPanson/moirai/blob/main/doc/%E6%A0%B8%E5%BF%83%E7%BA%BF%E7%A8%8B%E6%95%B0%E4%B8%BA%200%20%E6%97%B6%EF%BC%8C%E7%BA%BF%E7%A8%8B%E6%B1%A0%E5%A6%82%E6%9E%9C%E6%89%A7%E8%A1%8C%E4%BB%BB%E5%8A%A1%EF%BC%9F.md) \n+ [线程池中那些信息是可以被监控的？](https://github.com/PansonPanson/moirai/blob/main/doc/%E7%BA%BF%E7%A8%8B%E6%B1%A0%E4%B8%AD%E5%93%AA%E4%BA%9B%E4%BF%A1%E6%81%AF%E6%98%AF%E5%8F%AF%E4%BB%A5%E8%A2%AB%E7%9B%91%E6%8E%A7%E7%9A%84%EF%BC%9F.md)\n+ [线程池异常后：销毁还是复用](https://github.com/PansonPanson/moirai/blob/main/doc/%E7%BA%BF%E7%A8%8B%E6%B1%A0%E5%BC%82%E5%B8%B8%E5%90%8E%E6%98%AF%E8%A2%AB%E9%94%80%E6%AF%81%E8%BF%98%E6%98%AF%E5%A4%8D%E7%94%A8%EF%BC%9F.md) \n+ [线程池的核心线程会被回收吗？](https://github.com/PansonPanson/moirai/blob/main/doc/%E7%BA%BF%E7%A8%8B%E6%B1%A0%E7%9A%84%E6%A0%B8%E5%BF%83%E7%BA%BF%E7%A8%8B%E4%BC%9A%E8%A2%AB%E5%9B%9E%E6%94%B6%E5%90%97%EF%BC%9F.md)\n+ [线程池提交一个任务占多大内存？](https://github.com/PansonPanson/moirai/blob/main/doc/%E7%BA%BF%E7%A8%8B%E6%B1%A0%E6%8F%90%E4%BA%A4%E4%B8%80%E4%B8%AA%E4%BB%BB%E5%8A%A1%E5%8D%A0%E5%A4%9A%E5%A4%A7%E5%86%85%E5%AD%98%EF%BC%9F.md) \n+ [如何保证服务器宕机后线程池不丢失数据?](https://github.com/PansonPanson/moirai/blob/main/doc/%E5%A6%82%E4%BD%95%E4%BF%9D%E8%AF%81%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%AE%95%E6%9C%BA%E5%90%8E%E7%BA%BF%E7%A8%8B%E6%B1%A0%E4%B8%8D%E4%B8%A2%E5%A4%B1%E6%95%B0%E6%8D%AE%EF%BC%9F.md)\n+ [如何设计一个线程池](https://github.com/PansonPanson/moirai/blob/main/doc/%E5%A6%82%E4%BD%95%E4%BF%9D%E8%AF%81%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%AE%95%E6%9C%BA%E5%90%8E%E7%BA%BF%E7%A8%8B%E6%B1%A0%E4%B8%8D%E4%B8%A2%E5%A4%B1%E6%95%B0%E6%8D%AE%EF%BC%9F.md)\n+ [FutureTask源码深入分析？.md](doc/FutureTask%E6%BA%90%E7%A0%81%E6%B7%B1%E5%85%A5%E5%88%86%E6%9E%90%EF%BC%9F.md)\n+ [虚拟线程原理及性能分析.md](doc/%E8%99%9A%E6%8B%9F%E7%BA%BF%E7%A8%8B%E5%8E%9F%E7%90%86%E5%8F%8A%E6%80%A7%E8%83%BD%E5%88%86%E6%9E%90.md) \n+ [ForkJoinPool 源码深入分析？.md](doc/ForkJoinPool%20%E6%BA%90%E7%A0%81%E6%B7%B1%E5%85%A5%E5%88%86%E6%9E%90%EF%BC%9F.md)\n+ Spring 的线程池设计 \n  + Spring中Async注解底层异步线程池原理 \n+ Dubbo 的线程池设计 \n+ RocketMQ 的线程池设计 \n+ 时间轮\n+ [Tomcat 对 jdk 线程池进行了哪些修改？.md](doc/Tomcat%20%E5%AF%B9%20jdk%20%E7%BA%BF%E7%A8%8B%E6%B1%A0%E8%BF%9B%E8%A1%8C%E4%BA%86%E5%93%AA%E4%BA%9B%E4%BF%AE%E6%94%B9%EF%BC%9F.md)\n\n### Spring 相关\n+ [DisposableBean 作用与原理](https://github.com/PansonPanson/moirai/blob/main/doc/DisposableBean%E4%BD%9C%E7%94%A8%E4%B8%8E%E5%8E%9F%E7%90%86.md)\n+ [如何自定义一个 SpringBoot starter ?.md](doc/%E5%A6%82%E4%BD%95%E8%87%AA%E5%AE%9A%E4%B9%89%E4%B8%80%E4%B8%AA%20SpringBoot%20starter%3F.md)\n+ [SpringBoot starter 原理.md](doc/SpringBoot%20starter%20%E5%8E%9F%E7%90%86.md)\n\n### 框架涉及到的设计模式\n+ \n\n\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpansonpanson%2Fmoirai","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpansonpanson%2Fmoirai","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpansonpanson%2Fmoirai/lists"}