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插件 这篇是简单插件开发,下篇聊天记录插 ...
随机推荐
- 第2-3-3章 文件处理策略-文件存储服务系统-nginx/fastDFS/minio/阿里云oss/七牛云oss
目录 5.2 文件处理策略 5.2.1 FileStrategy 5.2.2 AbstractFileStrategy 5.2.3 LocalServiceImpl 5.2.4 FastDfsServ ...
- 【CVE-2022-0543】Redis Lua沙盒绕过命令执行复现
免责声明: 本文章仅供学习和研究使用,严禁使用该文章内容对互联网其他应用进行非法操作,若将其用于非法目的,所造成的后果由您自行承担,产生的一切风险与本文作者无关,如继续阅读该文章即表明您默认遵守该内容 ...
- 软件开发-客观综合(GO)
1 对从go源码和汇编源码生成可执行程序的过程,下面描述错误的是() A. 使用go tool compile可以将go源码编译成目标文件 B. 使用go tool asm可以将go源码编译成汇编代 ...
- Bugku login1
打开是个普普通通的登录界面,盲猜是注入题,先看看源码吧,没找到什么有用的信息,那就先注册试试 注册admin就已经存在,可能待会就爆破admin的密码也可能,因为没有验证嘛 试试注册其他的 登录发现他 ...
- 安装mySql 出现 one more product requirements have not been satisified
安装mySql 出现 one more product requirements have not been satisified 原因是缺少一些依赖环境. 在弹出的对话框中点击 否. 然后点击执行, ...
- Leetcode-SQL学习计划-SQL入门-1527.患某种疾病的患者【regexp正则表达式匹配】
链接:https://leetcode.cn/problems/patients-with-a-condition/ -- 1527.患某种疾病的患者 -- 链接:https://leetcode.c ...
- C++日期和时间编程总结
一,概述 二,C-style 日期和时间库 2.1,数据类型 2.2,函数 2.3,数据类型与函数关系梳理 2.4,时间类型 2.4.1,UTC 时间 2.4.2,本地时间 2.4.3,纪元时间 2. ...
- MySQL的select for update用法
MySQL中的select for update大家应该都有所接触,但什么时候该去使用,以及有哪些需要注意的地方会有很多不清楚的地方,我把我如何使用和查询到的文档在此记录. 作用 select本身是一 ...
- 记一次InputStream流读取不完整留下的惨痛教训
前言 首先,问问大家下面这段流读取的代码是否存在问题呢? inputStream = .... try { // 根据inputStream的长度创建字节数组 byte[] arrayOfByte = ...
- UBOOT 启动流程
一.概述 uboot 的启动流程在网上有很多大佬记录,但是了对于像我这样的新手就有些困难了,而我也不做 uboot 相关的工作,所以没必去研究代码,这里我特意整理了一下,以流程图的形式展现代码执行的流 ...