[Java] Solon 框架的三大核心组件之一插件扩展体系

1、Solon 的三大核心组件

核心组件 说明
Plugin 插件扩展机制 提供"编码风格"的扩展体系
Ioc/Aop 应用容器 提供基于注入依赖的自动装配体系
Context+Handler 通用上下文处理接口 提供"开放式处理"适配体系(俗称,三元合一)

2、Solon Plugin 插件扩展机制

几种 Java 扩展机制:

扩展机制 描述 特点 体验风格 适用性
Java SPI Java 自带的 以接口为单位 配置风格 适用于所有 Java 生态(最通用)
Spring Factories Spring 框架提供的 以组件为单位 配置风格 适用于 Spring 生态体系
Solon Plugin Solon 框架提供的 以模块为单位 编码风格 适用于 Solon 生态体系

Solon Plugin 是 Java SPI 的一种"增强"模式,强调编码风格。插件模块元信息配置会申明一个 Plugin 接口的实现类,在应用启动时扫描元信息目录,以发现所有申明的插件实现。

Plugin 的接口定义:

java 复制代码
public interface Plugin {
    //启动
    void start(AppContext context) throws Throwable;
    //预停止
    default void prestop() throws Throwable{}
    //停止
    default void stop() throws Throwable{}
}

Plugin 实现类的元信息配置申明:以 META-INF/solon 为专属目录;使用 properties 格式;要配置插件的实现类及优先级。

复制代码
# META-INF/solon/{packname}.properties

solon.plugin={PluginImpl}   #插件实现类配置
solon.plugin.priority=1 #插件优化级配置。越大越优先,默认为0

3、Solon Plugin 插件示例

用一个数据缓存与事务相关的插件为例,以模块为单位实现整体装配(编码风格):

java 复制代码
public class DemoSolonPlugin implements Plugin {
    @Override
    public void start(AppContext context) {
        if (context.app() != null) {
            //添加事务控制支持
            if (context.app().source().isAnnotationPresent(EnableTransaction.class)) {
                //添加注解拦截器
                context.beanInterceptorAdd(Tran.class, TranInterceptor.instance, 120);
            }

            //添加缓存控制支持
            if (context.app().source().isAnnotationPresent(EnableCaching.class)) {
                //添加注解拦截器
                context.beanInterceptorAdd(CachePut.class, new CachePutInterceptor(), 110);
                context.beanInterceptorAdd(CacheRemove.class, new CacheRemoveInterceptor(), 110);
                context.beanInterceptorAdd(Cache.class, new CacheInterceptor(), 111);
            }
        }
        
        //根据配置自动构建数据源
        context.beanMake(DataSourcesAutoConfiguration.class);
    }
}

插件应用示意:

java 复制代码
@EnableTransaction
@EnableCaching
public class App {
    public static void main(String[] args) {
        Solon.start(App.class, args);
    }
}

@Component
public class DemoService {
    @Cache
    public String test() {
        return new Date().toString();
    }
    
    @Tran
    public void post() {
        ...
    }
}
相关推荐
·薯条大王3 小时前
经济实惠玩云服务器|一台云服务器多人共用,子账号配置教程
java·linux·运维·服务器·汇编·c++·python
ZJH__GO6 小时前
网络编程v4pro--实现聊天室文件传输功能
java·服务器·网络·计算机网络
程序员黑豆6 小时前
Windows 系统 Java 环境变量配置全攻略:解决“不是内部或外部命令”
java·前端·ai编程
命运之光6 小时前
【C语言完整代码】就诊信息管理系统
java·c语言·开发语言
凤山老林6 小时前
Spring Boot @Async 线上实战:从默认配置到生产级线程池治理
java·spring boot·后端
marvelyu7 小时前
每天10分钟学会OceanBase系列(Day 20):跨机房容灾实战——构建多数据中心高可用架构
java·大数据·数据库
AI人工智能+电脑小能手8 小时前
大白话说Java设计模式-04-工厂方法模式(业务实战篇)
java·设计模式·工厂方法模式·架构设计·代码解耦
BUG指挥官9 小时前
Sa-Token和Spring Security对比
java·后端·spring
小当家.1059 小时前
深入理解 ReAct Agent:从原理到 Java 实战
java·react.js·agent·react·架构设计·agent设计
geminigoth9 小时前
Spring AI Alibaba 入门开发一(备份)
java·人工智能·spring