# easy-extension
**Repository Path**: wangruchao/easy-extension
## Basic Information
- **Project Name**: easy-extension
- **Description**: No description available
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: feature/zs
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2025-03-03
- **Last Updated**: 2025-03-03
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Easy-Extension
Easy-Extension框架主要解决`复杂系统的扩展性问题`,系统提供`扩展点`,业务进行`个性化实现`,从而达到系统通用流程和业务特殊逻辑解耦的目的。
框架适用于有多接入方,且不同接入方有复杂定制化的扩展诉求场景,例如电商交易,履约等中台系统。
## ✨ v3 新特性
* 支持通过注解@Ability、@Business方式定义能力和业务
* 支持一次请求命中多业务场景
* 提供可视化[管理后台](#-管理后台),方便管理扩展点、能力及业务
* v2、v3能力和业务定义简单对比,v3更简洁灵活
| 框架版本 | v2 & v3 API对比 |
|--------|----------------------------------------------------------|
| 能力定义对比 |
|
| 业务定义对比 |
> |
## 🖇️ 整体架构
## ⭐️ 核心概念
* 扩展点: 扩展点是系统提供的扩展能力,本质就是一个接口,业务方通过自定义实现进行扩展。
* 能力: 能力是一组扩展点的实现,是系统提供的通用产品能力,业务可以通过挂载能力来继承能力的扩展点实现。
* 业务: 业务即系统接入方,可以通过挂载能力来继承能力的扩展点实现,也可以对扩展点进行自定义实现。
## 🌈 快速开始
完整样例请参考: [easy-extension-sample](https://github.com/xiaoshicae/easy-extension-sample)
* 第一步: 引入依赖
```xml
io.github.xiaoshicae
easy-extension-spring-boot-starter
3.1.1
```
* 第二步: 定义扩展点,能力及业务
```java
// 扩展点1
@ExtensionPoint
public interface Ext1 {
String doSomething1();
}
// 能力X
@Ability(code = "app.ability.x")
public class AbilityX implements Ext1 {
public String doSomething1() {
return "AbilityX doSomething1";
}
}
// 业务A 挂载了能力("app.ability.x" 即能力X)
@Business(code = "xxx.biz.a", abilities = {"app.ability.x"})
public class BusinessA implements Ext1 {
public String doSomething1() {
return "BusinessA doSomething1";
}
}
```
* 第三步: 注入并使用扩展点
```java
@RestController
@RequestMapping("/api")
public class Controller {
/**
* 系统提供的扩展点1
* 注解@ExtensionInject会注入扩展点1的动态代理
* 运行时会根据匹配到的业务及使用的能力,选择有最高优先级的生效的扩展点实现
* 如果业务及使用的能力都没有实现该扩展点,则会走默认实现进行兜底
*/
@ExtensionInject
private Ext1 ext1;
/**
* 系统提供的扩展点2
*/
@ExtensionInject
private Ext2 ext2;
/**
* 系统提供的扩展点3
* 注解@ExtensionInject会注入List的动态代理,包含所有生效的实现
* 运行时会根据匹配到的业务及使用的能力,按照优先级依次包含生效的扩展实现
* List当然也包含扩展点的默认实现
*/
@ExtensionInject
private List ext3List;
@RequestMapping("/process")
public String process() {
String s1 = ext1.doSomething1(); // 执行扩展点1,具体用哪个实现,由匹配到的业务及生效的能力+优先级决定
String s2 = ext2.doSomething2(); // 执行扩展点2,具体用哪个实现,由匹配到的业务及生效的能力+优先级决定
List s3List = new ArrayList<>();
for (Ext3 ext3 : ext3List) {
s3List.add(ext3.doSomething3()); // 按优先级从高到低,依次执行扩展点3的业务或生效能力的实现
}
return String.format("res: ext1 = %s, ext2 = %s, ext3List = %s", s1, s2, Arrays.toString(s3List.toArray()));
}
}
```
## 🖥 管理后台
* 在线体验地址: https://www.xlemon.site/easy-extension-admin
* 接入步骤:
* 引入依赖
```xml
io.github.xiaoshicae
easy-extension-admin-spring-boot-starter
3.1.1
```
* 默认访问的url: /easy-extension-admin
* 管理后台提供的能力:
* 提供扩展点,能力和业务的可视化能力

* 提供了扩展点冲突检测能力 (业务及能力可能实现了相同的扩展点,可能存在冲突。发生冲突时,会选择优先级最高的实现)

## 📖 文档
框架设计及详细使用文档请参考: [wiki](https://github.com/xiaoshicae/easy-extension/wiki)
## 🌐 语言
Go版本的easy-extension可以参考: [go-easy-extension](https://github.com/xiaoshicae/go-easy-extension)
## ⚠️ License
Easy-Extension遵循Apache开源协议,具体内容请参考LICENSE文件。