# saas-dpi-y **Repository Path**: dreamer-07/saas-dpi-y ## Basic Information - **Project Name**: saas-dpi-y - **Description**: 这是一个为 Java 开发者提供 Saas 多租户定制化功能的库 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2023-03-02 - **Last Updated**: 2023-03-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: Spring, saas, plugin ## README # saas-dpi-y 这是一个为 Java 开发者提供 Saas 多租户定制化功能的库 ### 安装 正在上传 ing ### 示例 原业务类 - 上层接口 ```java public interface ISysDepartService extends IService{ ``` - 具体实现类 ```java @Service @Primary // 避免接下来使用 @Autowired 报错 public class SysDepartServiceImpl extends ServiceImpl implements ISysDepartService ``` 针对租户A需要定制化 `SysDepartServiceImpl` 类的方法(例如保存的时候要添加额外的信息或逻辑) 使用插件: 1. 创建一个 `ISysDepartService` 的实现类,并使用 **@SaasPlugin** 注解表示这个类要被哪个租户使用并重写相关的方法即可 ```java @Component @SaasPlugin("1") public class SysUserDepartServiceAImpl extends SysDepartServiceImpl{ ``` `注意,这里是继承了 原业务类/具体实现类,因为可能大部分的方法都不需要改变,那么就使用默认的,需要定制化的方法重写即可` 2. 在需要使用 ==定制化业务的实例对象的类== 上使用 **@UseSaasPlugin** 注解并内部定义相关属性 ```java @UseSaasPlugin(ISysDepartService.class) public class SysDepartController { @Autowired private ISysUserDepartService sysUserDepartService; ``` `这一块的设计有问题,可能很多地方都需要业务定制的对象,每个类上都加该注解太麻烦了,后续优化` 3. 因为需要根据租户信息(tenant_id)切换业务实例,所以库中提供了 **cn.prover.context.TenantContext** 类,通过该类注入租户信息(tenant_id)即可 ```java TenantContext.set("1") /* * !!!注意,由于内部使用了 ThreadLocal 来保存了租户信息,所以在使用后要调用 clear 方法 * - 比如通过 HandlerInterceptor 在请求进来和退出后保存和删除租户信息 */ TenantContext.clear() ``` ### 特性 - 小巧轻量,基于 Spring 环境引入依赖后使用相关注解即可实现定制化的业务逻辑 - 比起传统的策略模式,无需修改删除之前的代码逻辑,即插即用 ### 特别感谢 - 唐总 - 鸡哥 ### 已知问题 - 性能问题(还没测试,有无大佬能给个测试方案(doge ) - 如果是多定制业务逻辑类嵌套调用,会出问题,因为内部是用 ThreadLocal 保存的**一个**目标业务类,如果是多个嵌套调用就会报错 ### 补充 > 开发者只是个刚上班的小菜只因,市面上也不知道有什么类似的库莫得,比较喜欢钻研就做了,有什么不足还希望大佬们多多指导 - 邮箱:2391105059@qq.com