# dynamic-loader-demo **Repository Path**: huangxfchn/dynamic-loader-demo ## Basic Information - **Project Name**: dynamic-loader-demo - **Description**: 线上服务Hotswap - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2019-05-19 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # dynamic-loader-demo ## 业务背景 前几天,有朋友问我,怎么在spring容器中实现热更新功能,具体是这样的,比如有一个接口 `Service`,默认实现类是 `ServiceA`,由于业务的发展,我们需要动态地将实现类替换成 `ServiceB`,并且对调用方是透明的。 其实,这种需求在我之前做过的算法平台中便已经存在了,线上业务需要动态地进行算法版本的迭代,我们在管理后台上传jar包并且通过MQ通知线上服务,线上服务接收到该消息之后便会对某一个对象进行热加载,完成算法的热更新。 ## 实现原理 在spring容器启动的时候,将 `ServiceA` 进行动态代理增强,默认是调用原有的实现,如果发现有热更新,便调用更新之后的实现,伪代码如下: ``` class DynamicLoaderInterceptor implements MethodInterceptor { @Override public Object invoke(MethodInvocation invocation) throws Throwable { Class target = AopUtils.getTargetClass(invocation.getThis()); if (dynamicReloadContext.isReloaded(target)) { return dynamicReloadContext.invoke(target, invocation.getMethod(), invocation.getArguments()); } else { return invocation.proceed(); } } } ``` * @EnableDynamicReloader,在配置类中使用该注解便可以启动动态热更新插件,see: [LoaderApplication](src/main/java/net/dwade/loader/LoaderApplication.java) * @HotSwap,在需要热更新的 `Class` 上面使用该注解,eg:[DefaultAppRecommendService](src/main/java/net/dwade/loader/service/impl/DefaultAppRecommendService.java)