Solon 中也有一种非常解耦的扩展机制:Solon Plugin。这种扩展机制和Spring Factories很像,和SPI也很像。

一、Solon 中的扩展机制

在Solon的扩展插件加载机制,是在 solonplugin/{packname}.properties 文件中配置XPlugin的实现类名称,然后在程序中读取这些配置文件并实例化。这种自定义的SPI机制是Solon Plugin扩展实现的基础。

具体在扩展项目添加申明如下:

  • 添加配置:src/main/resources/solonplugin/{packname}.properties

    • 使用包为做不文件名,是为了避免冲突
  • 配置内容:solon.plugin={XPlugin impl}

XPlugin的作用:

在应用启动过程中,在特定的序顺位置,获取运行权限。

二、扩展示例,插件:solon.extend.aspect

这个插件,是为Solon提供 @XDao 和 @XService 扩展注解,进而实现class的动态代理能力;基于ASM实现,但算是比较克制,暂时没加别的功能。本例完整的项目源码:https://gitee.com/noear/solon/tree/master/_extend/solon.extend.aspect,此处主要展示与扩展机制有关系的代码和配置。

  • 代码文件:src/main/java/org.noear.solon.extend.aspect.XPluginImp.java,实现XPlugin接口:
package org.noear.solon.extend.aspect;

import org.noear.solon.XApp;
import org.noear.solon.core.Aop;
import org.noear.solon.core.XPlugin;
import org.noear.solon.extend.aspect.annotation.XDao;
import org.noear.solon.extend.aspect.annotation.XService; public class XPluginImp implements XPlugin {
@Override
public void start(XApp app) {
//向Aop工厂注册Bean生成器;代理XDao注解的处理
//
Aop.factory().beanCreatorAdd(XDao.class, (clz, bw, anno) -> {
//为BeanWrap设置class代理
bw.proxySet(BeanProxyImp.global());
}); //向Aop工厂注册Bean生成器;代理XService注解的处理
//
Aop.factory().beanCreatorAdd(XService.class, (clz, bw, anno) -> {
//为BeanWrap设置class代理
bw.proxySet(BeanProxyImp.global());
});
}
}
  • 配置文件:src/main/resources/solonplugin/solon.extend.aspect.properties,实现自申明效果:
solon.plugin=org.noear.solon.extend.aspect.XPluginImp

主框架会通过扫描 solonplugin 文件夹下的所有 .properties 文件,进而发现各种扩展插件的XPlugin实现类。

  • 应用示例
@XService
public class AppService {
@XInject
SqlMapper sqlMapper1; //
// @XService 注解,可为 bean 添加 class 动态代理;进而支持事务注解:@XTran
//
@XTran
public void addApp(){
sqlMapper1.appx_add();
}
}

三、附:Solon应用启动顺序

  1. 实例化 XApp.global()
  2. 加载应用属性配置
  3. 加载扩展文件夹
  4. 扫描插件并排序记录(插件也可叫扩展组件)
  5. 运行builder函数(如果它不为null)
  6. 运行插件
  7. 扫描source目录并加载java bean
  8. 加载渲染关系
  9. 完成

Solon详解(五)- Solon扩展机制之Solon Plugin的更多相关文章

  1. Solon详解(十)- 怎么用 Solon 开发基于 undertow jsp tld 的项目?

    Solon详解系列文章: Solon详解(一)- 快速入门 Solon详解(二)- Solon的核心 Solon详解(三)- Solon的web开发 Solon详解(四)- Solon的事务传播机制 ...

  2. Solon详解(11)- Mybatis 与 Solon 相亲相爱

    Solon详解系列文章: Solon详解(一)- 快速入门 Solon详解(二)- Solon的核心 Solon详解(三)- Solon的web开发 Solon详解(四)- Solon的事务传播机制 ...

  3. Springboot mini - Solon详解(五)- Solon扩展机制之Solon Plugin

    Springboot min -Solon 详解系列文章: Springboot mini - Solon详解(一)- 快速入门 Springboot mini - Solon详解(二)- Solon ...

  4. Solon详解(六)- Solon的校验扩展框架使用与扩展

    Solon详解系列文章: Solon详解(一)- 快速入门 Solon详解(二)- Solon的核心 Solon详解(三)- Solon的web开发 Solon详解(四)- Solon的事务传播机制 ...

  5. Springboot mini - Solon详解(六)- Solon的校验框架使用、定制与扩展

    Springboot min -Solon 详解系列文章: Springboot mini - Solon详解(一)- 快速入门 Springboot mini - Solon详解(二)- Solon ...

  6. Springboot mini - Solon详解(四)- Solon的事务传播机制

    Springboot min -Solon 详解系列文章: Springboot mini - Solon详解(一)- 快速入门 Springboot mini - Solon详解(二)- Solon ...

  7. Solon详解(二)- Solon的核心

    Solon详解系列文章: Solon详解(一)- 快速入门 Solon详解(二)- Solon的核心 Solon详解(三)- Solon的web开发 Solon详解(四)- Solon的事务传播机制 ...

  8. Solon详解(三)- Solon的web开发

    Solon详解系列文章: Solon详解(一)- 快速入门 Solon详解(二)- Solon的核心 Solon详解(三)- Solon的web开发 Solon详解(四)- Solon的事务传播机制 ...

  9. Solon详解(七)- Solon Ioc 的注解对比Spring及JSR330

    Solon详解系列文章: Solon详解(一)- 快速入门 Solon详解(二)- Solon的核心 Solon详解(三)- Solon的web开发 Solon详解(四)- Solon的事务传播机制 ...

  10. Solon详解(八)- Solon的缓存框架使用和定制

    Solon详解系列文章: Solon详解(一)- 快速入门 Solon详解(二)- Solon的核心 Solon详解(三)- Solon的web开发 Solon详解(四)- Solon的事务传播机制 ...

随机推荐

  1. 美团Leaf——全局序列生成器

    Leaf的Github地址: https://github.com/Meituan-Dianping/Leaf Leaf美团技术团队博客地址: https://tech.meituan.com/201 ...

  2. PHP sleep() 函数

    实例 延迟执行当前脚本 5 秒: <?phpecho date('h:i:s') . "<br>"; //sleep for 5 secondssleep(5); ...

  3. Python 图像处理 OpenCV (16):图像直方图

    前文传送门: 「Python 图像处理 OpenCV (1):入门」 「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」 「Python ...

  4. 虚拟机安装Centos(VirtulBox)

    阿里云服务器本月底到期了,之前自己犹豫不觉没上279元3年服务器的车,但是又要用linux,所以有了这篇文章. VirtulBox 一款开源的虚拟化主机应用,可以实现一台电脑上运行多个操作系统(Lin ...

  5. Flask框架(二):路由与蓝图

    一.路由 使用 route() 装饰器来把函数绑定到 URL: @app.route('/') def index(): return 'Index Page' @app.route("/h ...

  6. Linux 文件IO简单实例

    目录 简述 代码 编译运行 简述 Linux下的所有资源都被抽象为文件,所以对所有资源的访问都是以设备文件的形式访问,设备文件的操作主要包括:打开.关闭.读.写.控制.修改属性等.下面的示例代码主要是 ...

  7. 038_go语言中的状态协程

    代码演示: package main import ( "fmt" "math/rand" "sync/atomic" "time ...

  8. QT下UDP套接字通信——QUdpSocket 简单使用

    QT下UDP套接字通信--QUdpSocket QUdpSocket类提供一个UDP套接字. UDP(用户数据报协议)是一种轻量级.不可靠.面向数据报.无连接的协议.它可以在可靠性不重要的情况下使用. ...

  9. CenterNet文献调研记录

    心仪院校导师任务之一,文献调研记录. 本文部分思路参考: 1. Anchor-Free 2. https://zhuanlan.zhihu.com/p/66048276 3. https://blog ...

  10. jQuery 发布微博案例

    .box { width: 500px; height: 500px; border: 1px solid #efefef; margin: 0 auto; text-align: center; } ...