- Published on
Java Saas 定制化插件开发
- Authors
- Name
- Prover
Saas 多租户定制化插件
一个为 Java 开发者提供 Saas 多租户定制化功能的库
安装
还未上传到 Maven 仓库,可以先从源代码仓库中复制过去
示例
原业务类
上层接口
public interface ISysDepartService extends IService<SysDepart>{
具体实现类
@Service @Primary // 避免接下来使用 @Autowired 报错 public class SysDepartServiceImpl extends ServiceImpl<SysDepartMapper, SysDepart> implements ISysDepartService
针对租户A需要定制化 SysDepartServiceImpl
类的方法(例如保存的时候要添加额外的信息或逻辑)
使用插件:
创建一个
ISysDepartService
的实现类,并使用 @SaasPlugin 注解表示这个类要被哪个租户使用并重写相关的方法即可@Component @SaasPlugin("1") public class SysUserDepartServiceAImpl extends SysDepartServiceImpl{
注意,这里是继承了 原业务类/具体实现类,因为可能大部分的方法都不需要改变,那么就使用默认的,需要定制化的方法重写即可
在需要使用 ==定制化业务的实例对象的类== 上使用 @UseSaasPlugin 注解并内部定义相关属性
@UseSaasPlugin(ISysDepartService.class) public class SysDepartController { @Autowired private ISysUserDepartService sysUserDepartService;
这一块的设计有问题,可能很多地方都需要业务定制的对象,每个类上都加该注解太麻烦了,后续优化
因为需要根据租户信息(tenant_id)切换业务实例,所以库中提供了 cn.prover.context.TenantContext 类,通过该类注入租户信息(tenant_id)即可
TenantContext.set("1") /* * !!!注意,由于内部使用了 ThreadLocal 来保存了租户信息,所以在使用后要调用 clear 方法 * - 比如通过 HandlerInterceptor 在请求进来和退出后保存和删除租户信息 */ TenantContext.clear()
已知问题
- 性能问题(还没测试,有无大佬能给个测试方案(doge )
- 如果是多定制业务逻辑类嵌套调用,会出问题,因为内部是用 ThreadLocal 保存的一个目标业务类,如果是多个嵌套调用就会报错
补充
开发者只是个刚上班的小菜只因,市面上也不知道有什么类似的库莫得,比较喜欢钻研就做了,有什么不足还希望大佬们多多指导
特别感谢
- 唐总
- 鸡哥
源码解析
TODO:挖坑挖坑