{"id":38358364,"url":"https://github.com/xiaoshicae/easy-extension","last_synced_at":"2026-01-17T03:17:52.322Z","repository":{"id":242332916,"uuid":"809231162","full_name":"xiaoshicae/easy-extension","owner":"xiaoshicae","description":"扩展点-插件化框架","archived":false,"fork":false,"pushed_at":"2025-01-23T09:29:06.000Z","size":3359,"stargazers_count":94,"open_issues_count":1,"forks_count":14,"subscribers_count":5,"default_branch":"main","last_synced_at":"2025-01-23T10:28:36.032Z","etag":null,"topics":["framework"],"latest_commit_sha":null,"homepage":"","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/xiaoshicae.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":"2024-06-02T04:59:31.000Z","updated_at":"2025-01-23T09:27:59.000Z","dependencies_parsed_at":"2024-07-16T17:21:13.422Z","dependency_job_id":"7cd3e749-07fc-4bd4-85fb-b17a25d4d1f2","html_url":"https://github.com/xiaoshicae/easy-extension","commit_stats":null,"previous_names":["xiaoshicae/easy-extension"],"tags_count":8,"template":false,"template_full_name":null,"purl":"pkg:github/xiaoshicae/easy-extension","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xiaoshicae%2Feasy-extension","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xiaoshicae%2Feasy-extension/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xiaoshicae%2Feasy-extension/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xiaoshicae%2Feasy-extension/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/xiaoshicae","download_url":"https://codeload.github.com/xiaoshicae/easy-extension/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xiaoshicae%2Feasy-extension/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28492633,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-17T02:39:23.645Z","status":"ssl_error","status_checked_at":"2026-01-17T02:34:19.649Z","response_time":85,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["framework"],"created_at":"2026-01-17T03:17:52.236Z","updated_at":"2026-01-17T03:17:52.303Z","avatar_url":"https://github.com/xiaoshicae.png","language":"Java","funding_links":[],"categories":["开发框架"],"sub_categories":["Spring Cloud框架"],"readme":"# Easy-Extension\n\nEasy-Extension框架主要解决`复杂系统的扩展性问题`，系统提供`扩展点`，业务进行`个性化实现`，从而达到系统通用流程和业务特殊逻辑解耦的目的。\n框架适用于有多接入方，且不同接入方有复杂定制化的扩展诉求场景，例如电商交易，履约等中台系统。\n\n## ✨ v3 新特性\n\n* 支持通过注解@Ability、@Business方式定义能力和业务\n* 支持一次请求命中多业务场景\n* 提供可视化[管理后台](#-管理后台)，方便管理扩展点、能力及业务\n* v2、v3能力和业务定义简单对比，v3更简洁灵活\n\n| 框架版本   | v2 \u0026 v3 API对比                                            |\n|--------|----------------------------------------------------------|\n| 能力定义对比 | \u003cimg src=\"/doc/v2-v3-ability.png\" width=800 alt=\"对比图\"\u003e   |\n| 业务定义对比 | \u003cimg src=\"/doc/v2-v3-business.png\" width=800 alt=\"对比图\"\u003e\u003e |\n\n## 🖇️ 整体架构\n\n\u003cimg src=\"/doc/global-arc.png\" width=900 alt=\"架构图\"\u003e\n\n## ⭐️ 核心概念\n\n* 扩展点: 扩展点是系统提供的扩展能力，本质就是一个接口，业务方通过自定义实现进行扩展。\n* 能力: 能力是一组扩展点的实现，是系统提供的通用产品能力，业务可以通过挂载能力来继承能力的扩展点实现。\n* 业务: 业务即系统接入方，可以通过挂载能力来继承能力的扩展点实现，也可以对扩展点进行自定义实现。\n\n## 🌈 快速开始\n\n完整样例请参考: [easy-extension-sample](https://github.com/xiaoshicae/easy-extension-sample)\n\n* 第一步: 引入依赖\n    ```xml\n    \u003cdependency\u003e\n        \u003cgroupId\u003eio.github.xiaoshicae\u003c/groupId\u003e\n        \u003cartifactId\u003eeasy-extension-spring-boot-starter\u003c/artifactId\u003e\n        \u003cversion\u003e3.1.1\u003c/version\u003e\n    \u003c/dependency\u003e\n    ```\n* 第二步: 定义扩展点，能力及业务\n   ```java\n  // 扩展点1\n  @ExtensionPoint\n  public interface Ext1 {\n      String doSomething1();\n  }\n      \n  // 能力X\n  @Ability(code = \"app.ability.x\")\n  public class AbilityX implements Ext1 {\n      public String doSomething1() {\n          return \"AbilityX doSomething1\";\n      }\n  }\n      \n  // 业务A 挂载了能力(\"app.ability.x\" 即能力X)\n  @Business(code = \"xxx.biz.a\", abilities = {\"app.ability.x\"})\n  public class BusinessA  implements Ext1 {\n      public String doSomething1() {\n          return \"BusinessA doSomething1\";\n      }\n  }\n  ```\n* 第三步: 注入并使用扩展点\n    ```java\n    @RestController\n    @RequestMapping(\"/api\")\n    public class Controller {\n        /**\n         * 系统提供的扩展点1\n         * 注解@ExtensionInject会注入扩展点1的动态代理\n         * 运行时会根据匹配到的业务及使用的能力，选择有最高优先级的生效的扩展点实现\n         * 如果业务及使用的能力都没有实现该扩展点，则会走默认实现进行兜底\n         */\n        @ExtensionInject\n        private Ext1 ext1;\n    \n    \n        /**\n         * 系统提供的扩展点2\n         */\n        @ExtensionInject\n        private Ext2 ext2;\n    \n        /**\n         * 系统提供的扩展点3\n         * 注解@ExtensionInject会注入List\u003cExtension\u003e的动态代理，包含所有生效的实现\n         * 运行时会根据匹配到的业务及使用的能力，按照优先级依次包含生效的扩展实现\n         * List当然也包含扩展点的默认实现\n         */\n        @ExtensionInject\n        private List\u003cExt3\u003e ext3List;\n    \n        @RequestMapping(\"/process\")\n        public String process() {\n            String s1 = ext1.doSomething1(); // 执行扩展点1，具体用哪个实现，由匹配到的业务及生效的能力+优先级决定\n            String s2 = ext2.doSomething2(); // 执行扩展点2，具体用哪个实现，由匹配到的业务及生效的能力+优先级决定\n    \n            List\u003cString\u003e s3List = new ArrayList\u003c\u003e();\n            for (Ext3 ext3 : ext3List) {\n                s3List.add(ext3.doSomething3()); // 按优先级从高到低，依次执行扩展点3的业务或生效能力的实现\n            }\n            return String.format(\"res: ext1 = %s, ext2 = %s, ext3List = %s\", s1, s2, Arrays.toString(s3List.toArray()));\n        }\n    }\n    ```\n\n## 🖥 管理后台\n* 在线体验地址: https://www.xlemon.site/easy-extension-admin\n* 接入步骤:\n  * 引入依赖\n    ```xml\n    \u003cdependency\u003e\n        \u003cgroupId\u003eio.github.xiaoshicae\u003c/groupId\u003e\n        \u003cartifactId\u003eeasy-extension-admin-spring-boot-starter\u003c/artifactId\u003e\n        \u003cversion\u003e3.1.1\u003c/version\u003e\n    \u003c/dependency\u003e\n    ```\n  * 默认访问的url: /easy-extension-admin\n  * 管理后台提供的能力:\n      * 提供扩展点，能力和业务的可视化能力\n        ![](/doc/admin-extension.png)\n      * 提供了扩展点冲突检测能力 (业务及能力可能实现了相同的扩展点，可能存在冲突。发生冲突时，会选择优先级最高的实现)\n        ![](/doc/admin-business-conflict.png)\n\n## 📖 文档\n\n框架设计及详细使用文档请参考: [wiki](https://github.com/xiaoshicae/easy-extension/wiki)\n\n## 🌐 语言\n\nGo版本的easy-extension可以参考: [go-easy-extension](https://github.com/xiaoshicae/go-easy-extension)\n\n## ⚠️ License\n\nEasy-Extension遵循Apache开源协议，具体内容请参考LICENSE文件。\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxiaoshicae%2Feasy-extension","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fxiaoshicae%2Feasy-extension","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxiaoshicae%2Feasy-extension/lists"}