Solon詳解(五)- Solon擴展機制之Solon Plugin
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實現,但算是比較克制,暫時沒加別的功能。本例完整的項目源碼://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應用啟動順序
- 實例化 XApp.global()
- 載入應用屬性配置
- 載入擴展文件夾
- 掃描插件並排序記錄(插件也可叫擴展組件)
- 運行builder函數(如果它不為null)
- 運行插件
- 掃描source目錄並載入java bean
- 載入渲染關係
- 完成