Solon2 开发之插件,二、插件扩展机制(Spi)
插件扩展机制,是基于 “插件” + “配置申明” 实现的解耦的扩展机制(类似 Spring Factories、Java Spi):简单、弹性、自由。它的核心作用,是为模块获得了应用启动入口,并参与了应用生命周期。简称为 Solon 的 Spi。
像 @Tran、@Cache 之类的注解开发成果,都会希望能在所有项目中复用。它们就是基于插件扩展机制实现。
1、插件扩展机制
- 第一步:定制
插件实现类
(即实现插件生命周期的内部处理),实现类不能有注入。
//X开头可以让文件排序在未位,方便找到
public class XPluginImpl implements Plugin{
@Override
public void start(AopContext context) {
//插件启动时...
}
@Override
public void prestop() throws Throwable {
//插件预停止时(启用安全停止时:预停止后隔几秒才会进行停止)
}
@Override
public void stop(){
//插件停止时
}
}
- 第二步:通过
插件配置文件
申明自己,须全局唯一存在
约定插件配置文件:
#建议使用包做为文件名,便于识别,且可避免冲突
META-INF/solon/{packname}.properties
约定插件配置内容:
#插件实现类配置
solon.plugin={PluginImpl}
#插件优化级配置。越大越优先,默认为0
solon.plugin.priority=9
- 第三步:扫描并发现插件
程序启动时,扫描META-INF/solon/
目录下所有的.properties
文件,找到所有的插件并排序。
2、示例参考,插件:solon.aspect
这个插件提供了 @Dao
和 @Service
扩展注解,进而实现Class的动态代理能力。
- 插件实现类:
src/main/java/org.noear.solon.aspect.XPluginImp.java
package org.noear.solon.aspect;
import org.noear.solon.core.AopContext;
import org.noear.solon.core.Plugin;
import org.noear.solon.aspect.annotation.Dao;
import org.noear.solon.aspect.annotation.Service;
public class XPluginImp implements Plugin {
@Override
public void start(AopContext context) {
context.beanBuilderAdd(Dao.class, (clz, bw, anno) -> {
BeanProxy.binding(bw);
});
context.beanBuilderAdd(Service.class, (clz, bw, anno) -> {
BeanProxy.binding(bw);
});
}
}
- 插件配置文件:
src/main/resources/META-INF/solon/solon.aspect.properties
solon.plugin=org.noear.solon.aspect.XPluginImp
- 插件应用示例
//
// 引入 org.noear:solon.aspect 插件之后
//
@Service
public class AppService {
@Inject
SqlMapper sqlMapper1;
//
// @Service 注解,可为 bean 添加 class 动态代理;进而支持事务注解:@Tran
//
@Tran
public void addApp(){
sqlMapper1.appx_add();
}
}
Solon2 开发之插件,二、插件扩展机制(Spi)的更多相关文章
- Chrome扩展开发之二——Chrome扩展中脚本的运行机制和通信方式
目录: 0.Chrome扩展开发(Gmail附件管理助手)系列之〇——概述 1.Chrome扩展开发之一——Chrome扩展的文件结构 2.Chrome扩展开发之二——Chrome扩展中脚本的运行机制 ...
- MS CRM 2011的自定义和开发(11)——插件(plugin)开发(二)
http://www.cnblogs.com/StoneGarden/archive/2012/02/06/2339490.html MS CRM 2011的自定义和开发(11)——插件(plugin ...
- 关于Eclipse中开发插件(二)
原plugin.xml文件各个设置项的说明: 附上生成的文件代码: <?xml version="1.0" encoding="UTF-8"?> & ...
- 金蝶K3 wise 插件二次开发与配置
金蝶K3 wise 插件二次开发与配置 开发环境:K/3 Wise 13.0.K/3 Bos开发平台.Visual Basic 6.0 目录 一.二次开发插件编程二.代码演示三.配置插件四.测试插件五 ...
- Solon 的插件热插拨管理机制(H-Spi)
插件热插拨管理机制,简称:H-Spi.是框架提供的生产时用的另一种高级扩展方案.相对E-Spi,H-Spi 更侧重隔离.热插热拨.及管理性. 应用时,是以一个业务模块为单位进行开发,且封装为一个独立插 ...
- Notepad++进行php开发所必需的插件
Notepad++进行php开发所必需的插件有那些呢? 1. Compare: 可以用来比较两个文件不同之处. 2. Explorer:文件浏览器插件,包含收藏夹.Session保存功能.可与NppE ...
- MS CRM 2011的自定义和开发(11)——插件(plugin)开发(一)
http://www.cnblogs.com/StoneGarden/archive/2012/02/02/2336147.html MS CRM 2011的自定义和开发(11)——插件(plugin ...
- 【转】为eclipse安装python、shell开发环境和SVN插件
原文网址:http://www.crazyant.net/1185.html eclipse是一个非常好用的IDE,通常来说我们都用eclipse来开发JAVA程序,为了让开发python.shell ...
- xcode 必用插件二
本文大致整理了自己用过的一些插件的使用感想(就是好不好用). 在那之前先简单贴两条插件须知,知道的可以忽略. 1.Alcatraz 类似于管理第三方库的cocoapods,管理插件也有个Alcatra ...
- 跟我一步一步开发自己的Openfire插件
http://www.blogjava.net/hoojo/archive/2013/03/07/396146.html 跟我一步一步开发自己的Openfire插件 这篇是简单插件开发,下篇聊天记录插 ...
随机推荐
- 关于虚拟机使用桥接网络访问不到物理机IP的问题解决
问题描述 物理机可以ping 到虚拟机IP,虚拟机 ping 不到物理机IP 解决方法 关闭物理机防火墙,重启虚拟机
- win7修改开机动画
开机动画的修改 首先win7的过场动画是存在于C:\Windows\System32\bootres.dll ,而修改过程动画就需要修改这个dll,我不会改,所以只能用工具美化大师,软媒魔方里面的一个 ...
- 使用.NET7和C#11打造最快的序列化程序-以MemoryPack为例
译者注 本文是一篇不可多得的好文,MemoryPack 的作者 neuecc 大佬通过本文解释了他是如何将序列化程序性能提升到极致的:其中从很多方面(可变长度.字符串.集合等)解释了一些性能优化的技巧 ...
- html网页图片加载失败的友好处理方式
网络环境总是多样且复杂的,一张网页图片可能会因为网路状况差而加载失败或加载超长时间,也可能因为权限不足或者资源不存在而加载失败,这些都会导致用户体验变差,所以我们需要对图片加载失败时的情况进行一个弥补 ...
- 【大数据面试】【框架】Shuffle优化、内存参数配置、Yarn工作机制、调度器使用
三.MapReduce 1.Shuffle及其优化☆ Shuffle是Map方法之后,Reduce方法之前,混洗的过程 Map-->getPartition(标记数据的分区)-->对应的环 ...
- 保存sklearn中模型的两种方法(pickle、joblib)
保存sklearn中模型的两种方法(pickle.joblib) from sklearn import svm from sklearn import datasets clf = svm.SVC( ...
- 天坑,这样一个lambda随机取数据也有Bug
前几天,一位网友跟我说他编写的一段很简单的代码遇到了奇怪的Bug,他要达到的效果是从一个List中随机取出来一条数据,代码如下: 1 var random = new Random(); 2 var ...
- 持续发烧,聊聊Dart语言的并发处理,能挑战Go不?
前言 貌似关于Dart的文章没流量啊,就算在小编关怀上了首页,看得人还是很少的. 算了,今天持续发烧,再来写写如何使用 Dart 语言的并发操作.说起并发操作,玩 Go 的同学该笑了,这就是我们的看家 ...
- 二阶段目标检测网络-Mask RCNN 详解
ROI Pooling 和 ROI Align 的区别 Mask R-CNN 网络结构 骨干网络 FPN anchor 锚框生成规则 实验 参考资料 Mask RCNN 是作者 Kaiming He ...
- GitHub - 电脑经常无法访问GitHub页面
来自这里 1.打开Dns检测|Dns查询 - 站长工具2.在检测输入栏中输入http://github.com官网3.把检测列表里的TTL值最小的IP输入到host里,并对应写上github官网域名. ...