Springboot mini - Solon详解(五)- Solon扩展机制之Solon Plugin
Springboot min -Solon 详解系列文章:
Springboot mini - Solon详解(一)- 快速入门
Springboot mini - Solon详解(二)- Solon的核心
Springboot mini - Solon详解(三)- Solon的web开发
Springboot mini - Solon详解(四)- Solon的事务传播机制
Springboot mini - Solon 中也有一种非常解耦的扩展机制:Solon Plugin。这种扩展机制和Spring Factories像,和java SPI也很像。
一、Solon 中的扩展机制
在Solon的扩展插件加载机制,是在 META-INF/solon/{packname}.properties 文件中配置Plugin的实现类名称和优先级别,然后在程序中读取这些配置文件并实例化。这种自定义的SPI机制是Solon Plugin扩展实现的基础。
具体在扩展项目添加申明如下:
- 添加配置:
src/main/resources/META-INF/solon/{packname}.properties- 使用包做为文件名,是为了便于识别,且可避免冲突
- 配置内容:
solon.plugin={Plugin impl} #插件实现类
solon.plugin.priority=9 #加载优先级,越大越优先;默认不用配置
Plugin的作用:
在应用启动过程中,在特定的序顺位置,获取运行权限;进而进行框架扩展。
二、扩展示例,插件:solon.extend.aspect
这个插件,是为Solon提供 @Dao 和 @Service 扩展注解,进而实现class的动态代理能力;基于ASM实现,但算是比较克制,暂时没加别的功能。本例完整的项目源码:https://gitee.com/noear/solon/tree/master/_extend/solon.extend.aspect,此处主要展示与扩展机制有关系的代码和配置。
- 代码文件:
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();
}
}
附:Solon应用的启动顺序
- 实例化 Solon.global()
- 加载应用属性配置
- 加载扩展文件夹
- 扫描插件并排序记录(插件也可叫扩展组件)
- 运行builder函数(如果它不为null)
- 运行插件
- 扫描source目录并加载java bean
- 加载渲染关系
- 完成
附:Solon项目地址
- gitee: https://gitee.com/noear/solon
- github: https://github.com/noear/solon
Springboot mini - Solon详解(五)- Solon扩展机制之Solon Plugin的更多相关文章
- Solon详解(十)- 怎么用 Solon 开发基于 undertow jsp tld 的项目?
Solon详解系列文章: Solon详解(一)- 快速入门 Solon详解(二)- Solon的核心 Solon详解(三)- Solon的web开发 Solon详解(四)- Solon的事务传播机制 ...
- Solon详解(11)- Mybatis 与 Solon 相亲相爱
Solon详解系列文章: Solon详解(一)- 快速入门 Solon详解(二)- Solon的核心 Solon详解(三)- Solon的web开发 Solon详解(四)- Solon的事务传播机制 ...
- Solon详解(六)- Solon的校验扩展框架使用与扩展
Solon详解系列文章: Solon详解(一)- 快速入门 Solon详解(二)- Solon的核心 Solon详解(三)- Solon的web开发 Solon详解(四)- Solon的事务传播机制 ...
- Solon详解(二)- Solon的核心
Solon详解系列文章: Solon详解(一)- 快速入门 Solon详解(二)- Solon的核心 Solon详解(三)- Solon的web开发 Solon详解(四)- Solon的事务传播机制 ...
- Solon详解(三)- Solon的web开发
Solon详解系列文章: Solon详解(一)- 快速入门 Solon详解(二)- Solon的核心 Solon详解(三)- Solon的web开发 Solon详解(四)- Solon的事务传播机制 ...
- Solon详解(七)- Solon Ioc 的注解对比Spring及JSR330
Solon详解系列文章: Solon详解(一)- 快速入门 Solon详解(二)- Solon的核心 Solon详解(三)- Solon的web开发 Solon详解(四)- Solon的事务传播机制 ...
- Solon详解(八)- Solon的缓存框架使用和定制
Solon详解系列文章: Solon详解(一)- 快速入门 Solon详解(二)- Solon的核心 Solon详解(三)- Solon的web开发 Solon详解(四)- Solon的事务传播机制 ...
- Solon详解(九)- 渲染控制之定制统一的接口输出
Solon详解系列文章: Solon详解(一)- 快速入门 Solon详解(二)- Solon的核心 Solon详解(三)- Solon的web开发 Solon详解(四)- Solon的事务传播机制 ...
- Springboot mini - Solon详解(六)- Solon的校验框架使用、定制与扩展
Springboot min -Solon 详解系列文章: Springboot mini - Solon详解(一)- 快速入门 Springboot mini - Solon详解(二)- Solon ...
随机推荐
- centos7下做内存盘的方法
在找这个资料的时候,基本没几个能用的或者过时了的,或者是换了概念,做的不是需要的那种盘,只有少数文章有提到关键部分应该怎么去操作,现在还是自己总结一下 内存盘tmpfs和ramdisk的区别 这个在网 ...
- python之对元组的初步了解
元组: 元组与列表类似但是又有不同,主要的不同就是元组属于不可变序列,一旦创建,任何方法都不可以修改元素. 元组使用小括号( )表示,这与列表不一样,列表是用方括号表示[ ]. a=('a','b') ...
- 【进阶之路】Redis基础知识两篇就满足(一)
导言 大家好,我是南橘,一名练习时常两年半的java练习生,这是我在博客园的第一篇文章,当然,都是要从别处搬运过来的,不过以后新的文章也会在博客园同步发布,希望大家能多多支持^_^ 这篇文章的出现,首 ...
- Springboot整合163邮箱部署项目时发送不了邮件的解决方案
部署到腾讯云服务器时项目报错 Caused by: com.sun.mail.util.MailConnectException: Couldn't connect to host, port: sm ...
- 在Mac上也能轻松拥有Windows应用程序的简便方法
一般而言,如果我们想要在Windows的环境下下载一款软件那是件很方便的事情.只要我们登陆软件的官网进行下载即可.但是如果我们使用的是Mac OS系统,很多用户就会发现,许多软件会出现不兼容的情况. ...
- 开始使用 java8 的日期工具类
例如,现有的类(例如java.util.Date和SimpleDateFormatter)不是线程安全的,这会导致用户潜在的并发问题.而新的LocalDate.LocalDateTime.DateTi ...
- php 缩略图封装的方法
/** * PHP生成缩略图 * @param $basepath /原文件地址 * @param $des_w /缩略图的宽 * @param $des_h /缩略图的高 * @param $sty ...
- Python变量引用
>>>a=3 >>>b=a >>>a=4 >>>b >>>3 >>>List1=[1,2,3 ...
- 痞子衡嵌入式:探析开启CRC完整性校验的IAR工程生成.out和.bin文件先后顺序
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是开启CRC完整性校验的IAR工程生成.out和.bin文件先后顺序问题. 痞子衡之前写了一篇 <在IAR开发环境下为工程开启CRC ...
- Java蓝桥杯01——第一题集锦:堆煤球、购物单、哪天返回、第几天、分数
堆煤球(2016JavaB) 有一堆煤球,堆成三角棱锥形.具体: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形), 第四层10个(排列成三角形), .... 如果一共有100 ...