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实现,但算是比较克制,暂时没加别的功能。本例完整的项目源码: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/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应用启动顺序

  1. 实例化 XApp.global()
  2. 加载应用属性配置
  3. 加载扩展文件夹
  4. 扫描插件并排序记录(插件也可叫扩展组件)
  5. 运行builder函数(如果它不为null)
  6. 运行插件
  7. 扫描source目录并加载java bean
  8. 加载渲染关系
  9. 完成

最新文章

  1. JQuery选择器JQuery 事件
  2. Hibernate的数据查找,添加!
  3. XtraBackup原理解读
  4. Android学习笔记之短信验证码的获取和读取
  5. SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的 STATEMENT 'OpenRowset/OpenDatasource' 的访问,因为此组件已作为此服务器安全配置的一部分而被关闭。系统管理员可以通过使用 sp_configure 启用 'Ad Hoc Distributed Queries'。
  6. 20145315 《Java程序设计》实验五实验报告
  7. iOS学习之Object-C语言集合
  8. DelphiXE7中创建WebService(服务端+客户端)
  9. Web工程软件升级之数据库升级(一)
  10. CountDownLatch 和 CyclicBarrier 的运用及实现原理
  11. wamp虚拟机配置
  12. redis memcache
  13. 转:CSS Overflow 属性
  14. BEANUTIL 对象转JSON
  15. [Luogu1342] 请柬 - 最短路模板
  16. angular post 带参数 导出excel
  17. 《C#从现象到本质》读书笔记(五)第5章字符串第6章垃圾回收第7章异常与异常处理
  18. 求割点 割边 Tarjan
  19. 详解掩膜mask
  20. python多进程(一)

热门文章

  1. 【Laravel 】faker数据填充详解
  2. ken桑带你读源码 之 scrapy_redis
  3. springboot2.2 集成 activity6 请假完整示例
  4. 史蒂夫-乔布斯(Steve Jobs)斯坦福大学演讲稿(中英对照)
  5. 线程_multiprocessing实现文件夹copy器
  6. NodeJS 极简教程 <1> NodeJS 特点 & 使用场景
  7. Android中Activity启动模式探索
  8. Springboot开发web项目
  9. 详细记录了python爬取小说《元尊》的整个过程,看了你必会~
  10. Docker技术入门与实战