Springboot mini – Solon詳解(五)- Solon擴展機制之Solon Plugin

Springboot min -Solon 詳解系列文章:
Springboot mini – Solon詳解(一)- 快速入門
Springboot mini – Solon詳解(二)- Solon的核心
Springboot mini – Solon詳解(三)- Solon的web開發
Springboot mini – Solon詳解(四)- Solon的事務傳播機制

Springboot mini – Solon 中也有一種非常解耦的擴展機制:Solon Plugin。這種擴展機制和Spring Factories像,和java SPI也很像。

一、Solon 中的擴展機制

在Solon的擴展插件加載機制,是在 META-INF/solon/{packname}.properties 文件中配置Plugin的實現類名稱和優先級別,然後在程序中讀取這些配置文件並實例化。這種自定義的SPI機制是Solon Plugin擴展實現的基礎。

具體在擴展項目添加申明如下:

  • 添加配置:src/main/resources/META-INF/solon/{packname}.properties
    • 使用包做為文件名,是為了便於識別,且可避免衝突
  • 配置內容:
solon.plugin={Plugin impl}  #插件實現類
solon.plugin.priority=9      #加載優先級,越大越優先;默認不用配置

Plugin的作用:

在應用啟動過程中,在特定的序順位置,獲取運行權限;進而進行框架擴展。

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

這個插件,是為Solon提供 @Dao@Service 擴展註解,進而實現class的動態代理能力;基於ASM實現,但算是比較克制,暫時沒加別的功能。本例完整的項目源碼://gitee.com/noear/solon/tree/master/_extend/solon.extend.aspect,此處主要展示與擴展機制有關係的代碼和配置。

  • 代碼文件:src/main/java/org.noear.solon.extend.aspect.XPluginImp.java,實現Plugin接口:
package org.noear.solon.extend.aspect;

import org.noear.solon.SolonApp;
import org.noear.solon.core.Aop;
import org.noear.solon.core.Plugin;
import org.noear.solon.extend.aspect.annotation.Dao;
import org.noear.solon.extend.aspect.annotation.Service;

public class XPluginImp implements Plugin {
    @Override
    public void start(SolonApp app) {
        Aop.context().beanBuilderAdd(Dao.class, (clz, bw, anno) -> {
            bw.proxySet(BeanProxyImp.global());

            Aop.context().beanRegister(bw, "", true);
        });

        Aop.context().beanBuilderAdd(Service.class, (clz, bw, anno) -> {
            bw.proxySet(BeanProxyImp.global());

            Aop.context().beanRegister(bw, "", true);
        });
    }
}

  • 配置文件:src/main/resources/META-INF/solon/solon.extend.aspect.properties,實現自申明效果:
solon.plugin=org.noear.solon.extend.aspect.XPluginImp

主框架會通過掃描 META-INF/solon/ 文件夾下的所有 .properties 文件,進而發現各種擴展插件的Plugin實現類。

  • 應用示例
@Service
public class AppService {
    @Inject
    SqlMapper sqlMapper1;

    //
    // @Service 註解,可為 bean 添加 class 動態代理;進而支持事務註解:@Tran
    //
    @Tran
    public void addApp(){
        sqlMapper1.appx_add();
    }
}

附:Solon應用的啟動順序

  1. 實例化 Solon.global()
  2. 加載應用屬性配置
  3. 加載擴展文件夾
  4. 掃描插件並排序記錄(插件也可叫擴展組件)
  5. 運行builder函數(如果它不為null)
  6. 運行插件
  7. 掃描source目錄並加載java bean
  8. 加載渲染關係
  9. 完成

附:Solon項目地址