浅谈JAVA插件化扩展的几种方式

为什么需要插件化

方式

1.使用ClassLoder

简介

ClassLoader的具体作用就是将class文件加载到jvm虚拟机中去,程序就可以正确运行了。但是,jvm启动的时候,并不会一次性加载所有的class文件,而是根据需要去动态加载。JVM 运行实例中会存在多个 ClassLoader,不同的 ClassLoader 会从不同的地方加载字节码文件。重写load方法它可以从不同的文件目录加载,也可以从不同的 jar 文件中加载,也可以从网络上不同的服务地址来加载。基于此我们可以自定义类加载器进行自定义加载类在结合反射实现动态扩展。

特点
灵活,简单。
位于不同 ClassLoader 中名称一样的类实际上是不同的类
需要加载的是class字节码。
类卸载需要卸载整个classLoader。
可以结合JavaComplier实现动态编译热更(编排的技术)

应用场景:

1:代码的热更
2:类加密
3:加载自定义路径class

2.动态加载jar

简介

动态加载jar的实现也是基于classLoder实现的,其核心为URLClassLoader,继承自SecureClassLoader,支持从jar文件和文件夹中获取class。 URLClassLoader不仅可以加载jar中的class文件还可以加载resource资源。

特点
能实现更复杂的功能,并且能加载配置文件等
开发更方便解耦程度更高,直接加载单独的模块

应用场景:

1:idea插件,es插件,我的世界插件https://github.com/elastic/elasticsearch/blob/main/server/src/main/java/org/elasticsearch/plugins/PluginsService.java#L575

3.SPI机制

简介

SPI(Service Provider Interface),是JDK内置的一种服务提供发现机制,可以用来启用框架扩展和替换组件,主要是被框架的开发人员使用,比如java.sql.Driver接口,其他不同厂商可以针对同一接口做出不同的实现,MySQL和PostgreSQL都有不同的实现提供给用户,而Java的SPI机制可以为某个接口寻找服务实现。Java中SPI机制主要思想是将装配的控制权移到程序之外,在模块化设计中这个机制尤其重要,其核心思想就是解耦。

特点
能实现更复杂的功能,并且能加载配置文件等
开发更方便解耦程度更高,直接加载单独的模块

应用场景:

1:JDBC加载驱动
2. slf4j日志门面
3. Spring的spi

4.Java Agent

简介

Java代理(Java Agent)是一种用于在Java应用程序运行时修改字节码或监视应用程序的工具,JavaAgent通常通过Java InstrumentationAPI来实现,该API允许代理程序在类加载时修改字节码。代理程序可以通过Java Virtual Machine(JVM)提供的-java agent命令行选项来加载到应用程序中,或者通过在运行时使用Attach API动态附加到正在运行的JVM中。
特点
无需重新编译和部署。
解耦程度高,无侵入式。
可能产生额外性能开销。

应用场景:

1:基于feign染色环境实现
2:我的时间游戏插件加载器
3. Skywalking链路追踪

5.动态语言

简介

Java JSR223(Java Specification Request 223)是 Java 平台上的一项规范,用于支持在 Java 程序中嵌入各种脚本语言。这个规范的主要目的是允许开发人员将其他脚本语言(如JavaScript、Python、Ruby等)集成到Java应用程序中,从而可以在Java应用程序中执行这些脚本语言的代码。
特点
文本脚本热更方便。
可与Java语言交互。
上下文隔离
性能与原生java相差不多。
可能产生额外内存开销。

应用场景:

1:gradle构建脚本Groovy kts
2:Java平台上JavaScript引擎—Rhino/Nashorn

6.Spring插件化

Spring Framework 并不直接提供插件化机制,但它可以与其他框架和技术一起使用来实现插件化系统。插件化系统通常用于使应用程序更加灵活和可扩展,允许您动态地添加、移除或升级功能模块(插件)而无需修改应用程序的核心代码。常见实现是基于Spring Factories功能来实现扩展。
特点
Spring耦合 可以使用其特性。

应用场景:

1:xxx-boot-stater 一系列的stater

7.动态代理

Java动态代理是一种Java编程技术,用于创建在运行时动态生成的代理类。这些代理类可以用来代理其他类的方法调用,通常用于实现AOP(面向切面编程)和一些其他功能,例如性能监控、事务管理等。它的主要应用之一是实现插件扩展机制。
特点
无需修改原始类。
扩展方便。

应用场景:

1:Sping aop的实现基础
2:Mybatis的核心实现

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值