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實現,但算是比較剋制,暫時沒加別的功能。本例完整的專案原始碼:https://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應用的啟動順序
- 例項化 Solon.global()
- 載入應用屬性配置
- 載入擴充套件資料夾
- 掃描外掛並排序記錄(外掛也可叫擴充套件元件)
- 執行builder函式(如果它不為null)
- 執行外掛
- 掃描source目錄並載入java bean
- 載入渲染關係
- 完成
附:Solon專案地址
- gitee: https://gitee.com/noear/solon
- github: https://github.com/noear/solon