Solon2 开发之插件,二、插件扩展机制(Spi)
2024-10-20 16:15:34
插件扩展机制,是基于 “插件” + “配置申明” 实现的解耦的扩展机制(类似 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();
}
}
最新文章
- 详解Java GC的工作原理+Minor GC、FullGC
- lua 类支持属性不能被修改
- (满满的是硬货)Spring深入研究一IOC实现
- LINUX中,Vi编辑器的几种模式及保存、退出等命令
- 鸟哥的Linux私房菜之学习shell script
- Ubuntu下sqlite3的安装及使用
- Jquery方法大全
- SpringMVC4+MyBatis3+SQLServer 2014 整合(包括增删改查分页)
- php的定界符<;<;<;eof的问题
- Flex中的FusionCharts 2D折线图
- Codeforces Round #542 (Div. 1) 题解
- .NET Core 微服务架构 Steeltoe 使用(基于 Spring Cloud)
- 第六章 接口,lamda表达式与内部类
- Abhyankar&#39;s Conjecture
- JS代码排版工具
- POJ1080
- MT【196】整数个数
- List转换为字符串并添加分隔符
- AUC理解
- centos配置虚拟主机virtualhost,让服务器支持多网站多域名(转)
热门文章
- 还在为数据库事务一致性检测而苦恼?让Elle帮帮你,以TDSQL为例我们测测 | DB&#183;洞见#7
- JUnit 5 单元测试教程
- UBOOT编译--- UBOOT全部目标的编译过程详解(九)
- 真正“搞”懂HTTP协议05之What&#39;s HTTP?
- PGL图学习之基于GNN模型新冠疫苗任务[系列九]
- APACHE快速安装流程梳理
- 为什么 Random.Shared 是线程安全的
- 瞧瞧别人家的API接口,那叫一个优雅
- Typora快捷键--实用
- JavaScript:如何知道一个变量的数据类型?:typeof