[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 的接口定义:
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 插件示例
用一个数据缓存与事务相关的插件为例,以模块为单位实现整体装配(编码风格):
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);
    }
}
插件应用示意:
@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() {
        ...
    }
}
[Java] Solon 框架的三大核心组件之一插件扩展体系的更多相关文章
- Java 分布式框架面试题合集
		Java 分布式框架面试题合集 1.什么是 ZooKeeper? 答:ZooKeeper 是一个开源的分布式应用程序协调服务,是一个典型的分布式数据一致性解决方案.设计目的是将那些复杂且容易出错的分布 ... 
- Java集合框架(常用类) JCF
		Java集合框架(常用类) JCF 为了实现某一目的或功能而预先设计好一系列封装好的具有继承关系或实现关系类的接口: 集合的由来: 特点:元素类型可以不同,集合长度可变,空间不固定: 管理集合类和接口 ... 
- Java集合框架的总结
		本篇文章先从整体介绍了Java集合框架包含的接口和类,然后总结了集合框架中的一些基本知识和关键点,并结合实例进行简单分析.当我们把一个对象放入集合中后,系统会把所有集合元素都当成Object类的实例进 ... 
- 读《架构探险——从零开始写Java Web框架》
		内容提要 <架构探险--从零开始写Java Web框架>首先从一个简单的 Web 应用开始,让读者学会如何使用 IDEA.Maven.Git 等开发工具搭建 Java Web 应用:接着通 ... 
- java集合框架1
		1.综述 所有集合类都位于java.util包下.集合中只能保存对象(保存对象的引用变量).(数组既可以保存基本类型的数据也可以保存对象). 当我们把一个对象放入集合中后,系统会把所有集合元素都当成O ... 
- Java集合框架的知识总结(1)
		说明:先从整体介绍了Java集合框架包含的接口和类,然后总结了集合框架中的一些基本知识和关键点,并结合实例进行简单分析. 1.综述 所有集合类都位于java.util包下.集合中只能保存对象(保存对象 ... 
- [转]轻量级 Java Web 框架架构设计
		工作闲暇之余,我想设计并开发一款轻量级 Java Web 框架,看看能否取代目前最为流行的而又越来越重的 Spring.Hibernate 等框架.请原谅在下的大胆行为与不自量力,本人不是为了重造轮子 ... 
- Java集合框架的知识总结
		说明:面试准备,写的挺不错的. 转载地址: http://www.cnblogs.com/zhxxcq/archive/2012/03/11/2389611.html 1.综述 所有集合类都位于jav ... 
- Java集合框架(一)—— Collection、Iterator和Foreach的用法
		1.Java集合概述 在编程中,常常需要集中存放多个数据.当然我们可以使用数组来保存多个对象.但数组长度不可变化,一旦在初始化时指定了数组长度,则这个数组长度是不可变的,如果需要保存个数变化的数据,数 ... 
- Java后端框架之Spring Boot详解,文末有Java分布式实战项目视频可取
		在 Java 后端框架繁荣的今天,Spring 框架无疑是最最火热,也是必不可少的开源框架,更是稳坐 Java 后端框架的龙头老大. 用过 Spring 框架的都知道 Spring 能流行是因为它的两 ... 
随机推荐
- Linux下使用谷歌输入法
			Linux的中文输入法一直太烂,scim终于出来对googlePinyin的支持了. 安装步骤: 1.安装scim: sudo apt-get install scim 2.从git上checkout ... 
- 双重检查锁定及单例模式(ibm社区)
			本文来自ibm社区 单例创建模式是一个通用的编程习语.和多线程一起使用时,必需使用某种类型的同步.在努力创建更有效的代码时,Java 程序员们创建了双重检查锁定习语,将其和单例创建模式一起使用,从而限 ... 
- js逆向之jsRpc
			github: https://github.com/jxhczhl/JsRpc 简介: 通过远程调用(rpc)的方式免去抠代码补环境 原理: 在网站的控制台新建一个WebScoket客户端链接到服务 ... 
- 同步工具之Vector
			官网: https://vector.dev/ 用于构建可观察性管道的轻量级.超快速工具 [安装] curl --proto '=https' --tlsv1.2 -sSf https://sh.ve ... 
- Tornado框架之项目部署(六)
			知识点 supervisor配置与使用 nginx配置 目录: 部署Tornado 1. supervisor 安装 配置 启动 supervisorctl 2. nginx 部署Tornado 为了 ... 
- 如何优雅地在Django项目里生成不重复的ID?
			前言 本来标题是想叫"生成不重复的四位数"的,不过单纯数字有点局限,推广一下变成不重复 ID 吧~ 这个功能是在做下面图片里这个小项目时遇到的,有点像微信的面对面建群,生成一个随机 ... 
- 记一次cenos7安装nginx
			安装依赖 yum -y install gcc gcc-c++ make libtool zlib zlib-devel openssl openssl-devel pcre pcre-devel 下 ... 
- nrm安装后无法使用
			前情 在使用node.js的过程中,经常会时不是遇到有些包下载安装慢或者失败,有时可以尝试切换源来解决这类问题 坑 通过npm install nrm -g安装完nrm后运行nrm一直报错 Why? ... 
- 通过云主机调用API,一键训练部署商品问答模型
			本文分享自华为云社区<[开发者空间实践指导]CodeArts IDE调用API训练商品问答模型>,作者:开发者空间小蜜蜂. 一.案例介绍 在电子商务领域,售前和售后服务是确保客户满意度和提 ... 
- ARGOCD用户管理
			1.创建用户alice kubectl apply -f argocd-cm.yaml apiVersion: v1 kind: ConfigMap metadata: name: argocd-cm ... 
