Solon詳解系列文章:
Solon詳解(一)- 快速入門
Solon詳解(二)- Solon的核心
Solon詳解(三)- Solon的web開發
Solon詳解(四)- Solon的事務傳播機制
Solon詳解(五)- Solon擴展機制之Solon Plugin
Solon詳解(六)- Solon的校驗擴展框架使用與擴展 html
Solon 中也有一種很是解耦的擴展機制:Solon Plugin。這種擴展機制和Spring Factories很像,和SPI也很像。java
在Solon的擴展插件加載機制,是在 META-INF/solon/{packname}.properties
文件中配置XPlugin的實現類名稱和優先級別,而後在程序中讀取這些配置文件並實例化。這種自定義的SPI機制是Solon Plugin擴展實現的基礎。git
具體在擴展項目添加申明以下:web
src/main/resources/META-INF/solon/{packname}.properties
solon.plugin={XPlugin impl} #插件實現類 solon.plugin.priority=9 #加載優先級,越大越優先;默認不用配置
XPlugin的做用:sql
在應用啓動過程當中,在特定的序順位置,獲取運行權限;進而進行框架擴展。app
這個插件,是爲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/META-INF/solon/solon.extend.aspect.properties
,實現自申明效果:solon.plugin=org.noear.solon.extend.aspect.XPluginImp
主框架會經過掃描 META-INF/solon/
文件夾下的全部 .properties 文件,進而發現各類擴展插件的XPlugin實現類。ide
@XService public class AppService { @XInject SqlMapper sqlMapper1; // // @XService 註解,可爲 bean 添加 class 動態代理;進而支持事務註解:@XTran // @XTran public void addApp(){ sqlMapper1.appx_add(); } }