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(); } }