插件扩展机制,是基于 “插件” + “配置申明” 实现的解耦的扩展机制(类似 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();
}
}

最新文章

  1. 详解Java GC的工作原理+Minor GC、FullGC
  2. lua 类支持属性不能被修改
  3. (满满的是硬货)Spring深入研究一IOC实现
  4. LINUX中,Vi编辑器的几种模式及保存、退出等命令
  5. 鸟哥的Linux私房菜之学习shell script
  6. Ubuntu下sqlite3的安装及使用
  7. Jquery方法大全
  8. SpringMVC4+MyBatis3+SQLServer 2014 整合(包括增删改查分页)
  9. php的定界符<<<eof的问题
  10. Flex中的FusionCharts 2D折线图
  11. Codeforces Round #542 (Div. 1) 题解
  12. .NET Core 微服务架构 Steeltoe 使用(基于 Spring Cloud)
  13. 第六章 接口,lamda表达式与内部类
  14. Abhyankar's Conjecture
  15. JS代码排版工具
  16. POJ1080
  17. MT【196】整数个数
  18. List转换为字符串并添加分隔符
  19. AUC理解
  20. centos配置虚拟主机virtualhost,让服务器支持多网站多域名(转)

热门文章

  1. 还在为数据库事务一致性检测而苦恼?让Elle帮帮你,以TDSQL为例我们测测 | DB·洞见#7
  2. JUnit 5 单元测试教程
  3. UBOOT编译--- UBOOT全部目标的编译过程详解(九)
  4. 真正“搞”懂HTTP协议05之What's HTTP?
  5. PGL图学习之基于GNN模型新冠疫苗任务[系列九]
  6. APACHE快速安装流程梳理
  7. 为什么 Random.Shared 是线程安全的
  8. 瞧瞧别人家的API接口,那叫一个优雅
  9. Typora快捷键--实用
  10. JavaScript:如何知道一个变量的数据类型?:typeof