Springboot min -Solon 详解系列文章:
Springboot mini - Solon详解(一)- 快速入门
Springboot mini - Solon详解(二)- Solon的核心
Springboot mini - Solon详解(三)- Solon的web开发
Springboot mini - Solon详解(四)- Solon的事务传播机制html
Springboot mini - Solon 中也有一种很是解耦的扩展机制:Solon Plugin。这种扩展机制和Spring Factories像,和java SPI也很像。java
在Solon的扩展插件加载机制,是在 META-INF/solon/{packname}.properties
文件中配置Plugin的实现类名称和优先级别,而后在程序中读取这些配置文件并实例化。这种自定义的SPI机制是Solon Plugin扩展实现的基础。git
具体在扩展项目添加申明以下:github
src/main/resources/META-INF/solon/{packname}.properties
solon.plugin={Plugin impl} #插件实现类 solon.plugin.priority=9 #加载优先级,越大越优先;默认不用配置
Plugin的做用:web
在应用启动过程当中,在特定的序顺位置,获取运行权限;进而进行框架扩展。sql
这个插件,是为Solon提供 @Dao
和 @Service
扩展注解,进而实现class的动态代理能力;基于ASM实现,但算是比较克制,暂时没加别的功能。本例完整的项目源码:https://gitee.com/noear/solon/tree/master/_extend/solon.extend.aspect,此处主要展现与扩展机制有关系的代码和配置。app
src/main/java/org.noear.solon.extend.aspect.XPluginImp.java
,实现Plugin接口: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) -> { bw.proxySet(BeanProxyImp.global()); Aop.context().beanRegister(bw, "", true); }); Aop.context().beanBuilderAdd(Service.class, (clz, bw, anno) -> { bw.proxySet(BeanProxyImp.global()); Aop.context().beanRegister(bw, "", true); }); } }
src/main/resources/META-INF/solon/solon.extend.aspect.properties
,实现自申明效果:solon.plugin=org.noear.solon.extend.aspect.XPluginImp
主框架会经过扫描 META-INF/solon/
文件夹下的全部 .properties 文件,进而发现各类扩展插件的Plugin实现类。框架
@Service public class AppService { @Inject SqlMapper sqlMapper1; // // @Service 注解,可为 bean 添加 class 动态代理;进而支持事务注解:@Tran // @Tran public void addApp(){ sqlMapper1.appx_add(); } }