Solon详解(五)- Solon扩展机制之Solon Plugin
Solon 中也有一种非常解耦的扩展机制:Solon Plugin。这种扩展机制和Spring Factories很像,和SPI也很像。
一、Solon 中的扩展机制
在Solon的扩展插件加载机制,是在 solonplugin/{packname}.properties 文件中配置XPlugin的实现类名称,然后在程序中读取这些配置文件并实例化。这种自定义的SPI机制是Solon Plugin扩展实现的基础。
具体在扩展项目添加申明如下:
- 添加配置:src/main/resources/solonplugin/{packname}.properties- 使用包为做不文件名,是为了避免冲突
 
- 配置内容:solon.plugin={XPlugin impl}
XPlugin的作用:
在应用启动过程中,在特定的序顺位置,获取运行权限。
二、扩展示例,插件:solon.extend.aspect
这个插件,是为Solon提供 @XDao 和 @XService 扩展注解,进而实现class的动态代理能力;基于ASM实现,但算是比较克制,暂时没加别的功能。本例完整的项目源码:https://gitee.com/noear/solon/tree/master/_extend/solon.extend.aspect,此处主要展示与扩展机制有关系的代码和配置。
- 代码文件:src/main/java/org.noear.solon.extend.aspect.XPluginImp.java,实现XPlugin接口:
package org.noear.solon.extend.aspect;
import org.noear.solon.XApp;
import org.noear.solon.core.Aop;
import org.noear.solon.core.XPlugin;
import org.noear.solon.extend.aspect.annotation.XDao;
import org.noear.solon.extend.aspect.annotation.XService;
public class XPluginImp implements XPlugin {
    @Override
    public void start(XApp app) {
        //向Aop工厂注册Bean生成器;代理XDao注解的处理
        //
        Aop.factory().beanCreatorAdd(XDao.class, (clz, bw, anno) -> {
            //为BeanWrap设置class代理
            bw.proxySet(BeanProxyImp.global());
        });
        //向Aop工厂注册Bean生成器;代理XService注解的处理
        //
        Aop.factory().beanCreatorAdd(XService.class, (clz, bw, anno) -> {
            //为BeanWrap设置class代理
            bw.proxySet(BeanProxyImp.global());
        });
    }
}
- 配置文件:src/main/resources/solonplugin/solon.extend.aspect.properties,实现自申明效果:
solon.plugin=org.noear.solon.extend.aspect.XPluginImp
主框架会通过扫描 solonplugin 文件夹下的所有 .properties 文件,进而发现各种扩展插件的XPlugin实现类。
- 应用示例
@XService
public class AppService {
    @XInject
    SqlMapper sqlMapper1;
    //
    // @XService 注解,可为 bean 添加 class 动态代理;进而支持事务注解:@XTran
    //
    @XTran
    public void addApp(){
        sqlMapper1.appx_add();
    }
}
三、附:Solon应用启动顺序
- 实例化 XApp.global()
- 加载应用属性配置
- 加载扩展文件夹
- 扫描插件并排序记录(插件也可叫扩展组件)
- 运行builder函数(如果它不为null)
- 运行插件
- 扫描source目录并加载java bean
- 加载渲染关系
- 完成
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的事务传播机制 ... 
- Springboot mini - Solon详解(五)- Solon扩展机制之Solon Plugin
		Springboot min -Solon 详解系列文章: Springboot mini - Solon详解(一)- 快速入门 Springboot mini - Solon详解(二)- 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 ... 
- Springboot mini - Solon详解(四)- Solon的事务传播机制
		Springboot min -Solon 详解系列文章: Springboot mini - Solon详解(一)- 快速入门 Springboot mini - 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的事务传播机制 ... 
随机推荐
- Day05_vue入门
			学于黑马和传智播客联合做的教学项目 感谢 黑马官网 传智播客官网 微信搜索"艺术行者",关注并回复关键词"乐优商城"获取视频和教程资料! b站在线视频 学习目标 ... 
- [C++]类的空指针调用成员函数后,会发生什么事?
			类的实例调用成员函数的原理 其实不管是通过对象实例或指针实例调用,其实底层调用的过程都是一样的,都是把当前对象的指针作为一个参数传递给被调用的成员函数.通过下面的相关实例代码进行检验: 实验的C++代 ... 
- 9-Pandas之数据合并与轴向连接(pd.concat()的详解)
			数据合并:由于数据可能是不同的格式,且来自不同的数据源,为了方便之后的处理与加工,需要将不同的数据转换成一个DataFrame. Numpy中的concatenate().vstack().hstac ... 
- PHP 太空船运算符(组合比较符)
			PHP 7 新增加的太空船运算符(组合比较符)用于比较两个表达式 $a 和 $b,如果 $a 小于.等于或大于 $b时,它分别返回-1.0或1. 实例 <?php // 整型比较 print( ... 
- PHP array_multisort() 函数
			实例 返回一个升序排列的数组: <?php$a=array("Dog","Cat","Horse","Bear", ... 
- PDOStatement::getAttribute
			PDOStatement::getAttribute — 检索一个语句属性(PHP 5 >= 5.1.0, PECL pdo >= 0.2.0)高佣联盟 www.cgewang.com 说 ... 
- luogu P3217 [HNOI2011]数矩形
			LINK:数矩形 题意:给出n个点 求出一个最大的矩形. 矩形可以使斜着的.(不会告诉你样例我算了几年 这道题的一个潜规则 矩形面积都是整数 我也不知道为啥一定是整数 姑且是题目输出的要求吧. 所以用 ... 
- 【python设计模式-创建型】工厂方法模式
			工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻 ... 
- OpenCL设计优化(基于Intel  FPGA SDK for OpenCL)
			1.首先了解Intel FPGA SDK for OpenCL实现OpenCL的设计组件,包括: kernels, global memory interconnect, local memory, ... 
- 查看 Linux 系统服务的 5 大方法
			Linux 系统服务有时也称为守护程序,是在Linux启动时自动加载并在Linux退出时自动停止的系统任务. 在本文中,良许将为大家介绍如何列出 Linux 系统里所有运行的服务,以及如何检查某个服务 ... 
