springboot运行时新增/更新外部接口的实现方法

时间:2021-05-19

  最近有个需求:需要让现有springboot项目可以加载外部的jar包实现新增、更新接口逻辑。本着拿来主义的思维网上找了半天没有找到类似的东西,唯一有点相似的还是spring-loaded但是这个东西据我网上了解有如下缺点:

  1、使用java agent启动,个人倾向于直接使用pom依赖的方式

  2、不支持新增字段,新增方法,估计也不支持mybatis的xml加载那些吧,没了解过

  3、只适合在开发环境IDE中使用,没法生产使用

  无奈之下,我只能自己实现一个了,我需要实现的功能如下

  1、加载外部扩展jar包中的新接口,多次加载需要能完全更新

  2、应该能加载mybatis、mybatis-plus中放sql的xml文件

  3、应该能加载@Mapper修饰的mybatis的接口资源

  4、需要能加载其它被spring管理的Bean资源

  5、需要能在加载完成后更新swagger文档

  总而言之就是要实现一个能够扩展完整接口的容器,其实类似于热加载也不同于热加载,热部署是监控本地的class文件的改变,然后使用自动重启或者重载,热部署领域比较火的就是devtools和jrebel,前者使用自动重启的方式,监控你的classes改变了,然后使用反射调用你的main方法重启一下,后者使用重载的方式,因为收费,具体原理也没了解过,估计就是不重启,只加载变过的class吧。而本文实现的是加载外部的jar包,这个jar包只要是个可访问的URL资源就可以了。虽然和热部署不一样,但是从方案上可以借鉴,本文就是使用重载的方式,也就是只会更新扩展包里的资源。

  先来一个自定义的模块类加载器

package com.rdpaas.dynamic.core;import org.apache.commons.lang3.StringUtils;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.InputStream;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.net.URL;import java.net.URLClassLoader;import java.security.AccessController;import java.security.PrivilegedExceptionAction;import java.util.Enumeration;import java.util.HashMap;import java.util.Map;import java.util.jar.JarEntry;import java.util.jar.JarFile;/** * 动态加载外部jar包的自定义类加载器 * @author rongdi * @date 2021-03-06 * @blog https:///rongdi/springboot-dynamic

到此这篇关于springboot运行时新增/更新外部接口的实现方法的文章就介绍到这了,更多相关springboot外部接口内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章