1. 程式人生 > 其它 >Solon 開發進階,一、外掛擴充套件機制

Solon 開發進階,一、外掛擴充套件機制

像 @Tran、@Cache 之類的註解開發成果,都會希望能在所有專案中複用。Solon Plugin 是一種解耦的外掛擴充套件機制,簡單、彈性、自由。類似 Spring Factories、Java Spi。

Solon Plugin 機制的核心作用是:獲得了應用啟動入口,從而可以做一些事情。

1、Solon Plugin 機制

  • 第一步:定製外掛實現類
//X開頭可以讓檔案排序在未位,方便找到
public class XPluginImpl implements Plugin{
    @Override
    public void start(SolonApp app) {
        //外掛啟動時...
    }
}
  • 第二步:通過外掛配置檔案申明自己,須全域性唯一存在

約定外掛配置檔案:

#建議使用包做為檔名,便於識別,且可避免衝突
META-INF/solon/{packname}.properties

約定外掛配置內容:

#外掛實現類配置
solon.plugin={PluginImpl}  
#外掛優化級配置。越大越優先,預設為0
solon.plugin.priority=9      
  • 第三步:掃描並發現外掛

程式啟動時,掃描META-INF/solon/目錄下所有的.properties檔案,找到所有的外掛並排序。

2、示例參考,外掛:solon.extend.aspect

這個外掛提供了 @Dao

@Service 擴充套件註解,進而實現Class的動態代理能力。

  • 外掛實現類:src/main/java/org.noear.solon.extend.aspect.XPluginImp.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) -> {
            BeanProxy.binding(bw);
        });

        Aop.context().beanBuilderAdd(Service.class, (clz, bw, anno) -> {
            BeanProxy.binding(bw);
        });
    }
}

  • 外掛配置檔案:src/main/resources/META-INF/solon/solon.extend.aspect.properties
solon.plugin=org.noear.solon.extend.aspect.XPluginImp
  • 外掛應用示例
//
// 引入 org.noear:solon.extend.aspect 外掛之後
//

@Service
public class AppService {
    @Inject
    SqlMapper sqlMapper1;

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