[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() {
        ...
    }
}
相关推荐
木头没有瓜25 分钟前
idea离线安装插件
java·ide·intellij-idea
llwszx35 分钟前
Spring中DelayQueue深度解析:从原理到实战(附结构图解析)
java·后端·spring·delayqueue·延迟任务
述雾学java1 小时前
Spring Cloud Feign 整合 Sentinel 实现服务降级与熔断保护
java·spring cloud·sentinel
保持学习ing1 小时前
苍穹外卖day3--公共字段填充+新增菜品
java·阿里云·实战·springboot·前后端·外卖项目·阿里云文件存储
77qqqiqi1 小时前
正则表达式
java·后端·正则表达式
厦门德仔2 小时前
【WPF】WPF(样式)
android·java·wpf
大春儿的试验田2 小时前
高并发收藏功能设计:Redis异步同步与定时补偿机制详解
java·数据库·redis·学习·缓存
Gappsong8742 小时前
【Linux学习】Linux安装并配置Redis
java·linux·运维·网络安全
hqxstudying2 小时前
Redis为什么是单线程
java·redis
RainbowSea2 小时前
NVM 切换 Node 版本工具的超详细安装说明
java·前端