Solon詳解(五)- Solon擴充套件機制之Solon Plugin

劉之西東發表於2020-08-22

Solon詳解系列文章:
Solon詳解(一)- 快速入門
Solon詳解(二)- Solon的核心
Solon詳解(三)- Solon的web開發
Solon詳解(四)- Solon的事務傳播機制
Solon詳解(五)- Solon擴充套件機制之Solon Plugin

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. 完成

相關文章