zoukankan      html  css  js  c++  java
  • Solon 中的扩展机制

    在Solon的扩展插件加载机制,是在 META-INF/solon/{packname}.properties 文件中配置Plugin的实现类名称和优先级别,然后在程序中读取这些配置文件并实例化。这种自定义的SPI机制是Solon Plugin扩展实现的基础。

    具体在扩展项目添加申明如下:

    添加配置:src/main/resources/META-INF/solon/{packname}.properties
    使用包做为文件名,是为了便于识别,且可避免冲突
    配置内容:
    solon.plugin={Plugin impl} #插件实现类
    solon.plugin.priority=9 #加载优先级,越大越优先;默认不用配置
    Plugin的作用:

    在应用启动过程中,在特定的序顺位置,获取运行权限;进而进行框架扩展。

    二、扩展示例,插件:solon.extend.aspect
    这个插件,是为Solon提供 @Dao 和 @Service 扩展注解,进而实现class的动态代理能力;基于ASM实现,但算是比较克制,暂时没加别的功能。本例完整的项目源码:https://gitee.com/noear/solon/tree/master/_extend/solon.extend.aspect,此处主要展示与扩展机制有关系的代码和配置。

    代码文件:src/main/java/org.noear.solon.extend.aspect.XPluginImp.java,实现Plugin接口:
    package org.noear.solon.extend.aspect;

    import org.noear.solon.SolonApp;
    import org.noear.solon.core.Aop;
    import org.noear.solon.core.Plugin;
    import org.noear.solon.extend.aspect.annotation.Dao;
    import org.noear.solon.extend.aspect.annotation.Service;

    public class XPluginImp implements Plugin {
    @Override
    public void start(SolonApp app) {
    Aop.context().beanBuilderAdd(Dao.class, (clz, bw, anno) -> {
    bw.proxySet(BeanProxyImp.global());

            Aop.context().beanRegister(bw, "", true);
        });
    
        Aop.context().beanBuilderAdd(Service.class, (clz, bw, anno) -> {
            bw.proxySet(BeanProxyImp.global());
    
            Aop.context().beanRegister(bw, "", true);
        });
    }
    

    }

    配置文件:src/main/resources/META-INF/solon/solon.extend.aspect.properties,实现自申明效果:
    solon.plugin=org.noear.solon.extend.aspect.XPluginImp
    主框架会通过扫描 META-INF/solon/ 文件夹下的所有 .properties 文件,进而发现各种扩展插件的Plugin实现类。

    应用示例
    @Service
    public class AppService {
    @Inject
    SqlMapper sqlMapper1;

    //
    // @Service 注解,可为 bean 添加 class 动态代理;进而支持事务注解:@Tran
    //
    @Tran
    public void addApp(){
        sqlMapper1.appx_add();
    }
    

    }
    附:Solon应用的启动顺序
    实例化 Solon.global()
    加载应用属性配置
    加载扩展文件夹
    扫描插件并排序记录(插件也可叫扩展组件)
    运行builder函数(如果它不为null)
    运行插件
    扫描source目录并加载java bean
    加载渲染关系
    完成
    附:Solon项目地址
    gitee: https://gitee.com/noear/solon
    github: https://github.com/noear/solon

  • 相关阅读:
    Day 09 文件处理
    Day 08 字符编码
    day 07 猜年龄
    Day 07 元组/字典/集合/python深浅拷贝
    Day 06 猜年龄/三级菜单
    并发编程-Atomic的compareAndSet
    并发编程-多线程共享变量不安全
    Spring boot Junit单元测试回滚
    Java 不区分大小写比较字符串
    IDEA 设置html 和js热发布
  • 原文地址:https://www.cnblogs.com/Sorry-/p/14125818.html
Copyright © 2011-2022 走看看