1. 程式人生 > >Springboot mini - Solon詳解(五)- Solon擴充套件機制之Solon Plugin

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

> Springboot min -Solon 詳解系列文章: > [Springboot mini - Solon詳解(一)- 快速入門](https://www.cnblogs.com/noear/p/14115763.html) > [Springboot mini - Solon詳解(二)- Solon的核心](https://www.cnblogs.com/noear/p/14115817.html) > [Springboot mini - Solon詳解(三)- Solon的web開發](https://www.cnblogs.com/noear/p/14115846.html) > [Springboot mini - Solon詳解(四)- Solon的事務傳播機制](https://www.cnblogs.com/noear/p/14119759.html) 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` * 使用包做為檔名,是為了便於識別,且可避免衝突 * 配置內容: ```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](https://gitee.com/noear/solon/tree/master/_extend/solon.extend.aspect),此處主要展示與擴充套件機制有關係的程式碼和配置。 * 程式碼檔案:`src/main/java/org.noear.solon.extend.aspect.XPluginImp.java`,實現Plugin介面: ```java 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`,實現自申明效果: ```properties solon.plugin=org.noear.solon.extend.aspect.XPluginImp ``` 主框架會通過掃描 `META-INF/solon/` 資料夾下的所有 .properties 檔案,進而發現各種擴充套件外掛的Plugin實現類。 * 應用示例 ```java @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專案地址 * gitee: [https://gitee.com/noear/solon](https://gitee.com/noear/solon) * github: [https://github.com/noear/solon](https://github.com/noear