Java插件架构应继承定身份契约与生命周期、组合装可变行为与运行时策略:抽象基类定义元信息、状态机及模板方法,接口委托实现校验、通知、存储等能力,SPI+工厂解耦装配,事件总线通信,支持热插拔与版本共存。

Java 中打造灵活的业务插件架构,关键不是“只用继承”或“只用组合”,而是让两者各司其职:继承定义插件的**身份契约与生命周期规范**,组合承载插件的**可变行为与运行时策略**。这种混合模式既保持了插件体系的统一性,又避免了继承链僵化、职责爆炸的问题。
继承定骨架:用抽象基类统一插件身份与生命周期
所有插件必须继承一个顶层抽象类(如 Plugin),它不实现具体业务逻辑,只声明插件应有的“存在感”和“标准动作”:
- 定义插件元信息字段:
id、version、enabled(protected,供子类读取但不可随意修改) - 声明抽象方法作为强制扩展点:
init()、execute(Context ctx)、destroy() - 提供默认实现的模板方法:
safeExecute(Context ctx)内部调用before()→execute(ctx)→after(),其中before/after为 protected 空方法,供子类按需重写 - 统一管理插件状态机:通过
enum PluginState { INITIALIZING, READY, RUNNING, STOPPED }和受控的 state 变量,避免子类直接操作底层状态
组合装能力:用接口+委托解耦运行时行为
插件的具体执行逻辑不靠继承层层叠加,而是通过组合注入不同角色对象。每个角色对应一个接口,实现完全独立:
-
Validator接口负责校验输入,插件构造时可传入DefaultValidator或自定义OrderAmountValidator -
Notifier接口负责通知结果,支持邮件、短信、Webhook 多种实现,运行时可动态替换 -
StorageAdapter接口屏蔽底层存储差异(MySQL / Redis / 文件),插件不关心数据存哪,只调用save(data) - 组合对象全部声明为 final 字段,构造器注入,杜绝运行中被篡改;方法调用一律走委托,例如
this.validator.validate(ctx)
插件注册与装配:靠工厂+SPI 实现运行时解耦
插件实例的创建不依赖 new,而是由统一插件容器管理:
立即学习“Java免费学习笔记(深入)”;
- 使用 Java SPI(
META-INF/services/com.example.Plugin)自动发现所有实现类 - 插件工厂根据配置加载具体实现,并完成组合对象的装配:
new PaymentPlugin(new AlipayValidator(), new SmsNotifier(), new RedisStorage()) - 容器持有
List<Plugin>,但实际调用时通过多态(plugin.execute(ctx))路由到具体子类,无需 instanceof 判断 - 插件之间禁止直接引用,通信通过事件总线(如
EventBus.post(new PluginStartedEvent(id)))或上下文传递
升级与扩展:继承保障兼容,组合支持热插拔
当需要新增能力时,不用动继承链,而是扩展组合维度:
- 新增一种通知方式?只需实现
Notifier接口,插件工厂识别配置后自动注入 - 某插件需临时禁用校验?构造时传入
NoOpValidator,不影响原有继承结构和生命周期 - 老插件升级版本?新版本继承同一基类,覆盖
execute()即可,旧插件仍可共存运行 - 若某插件需跨层级复用逻辑(如风控规则),不通过继承父类,而是提取为独立服务类,被多个插件组合使用


















