• Solon 开发进阶,一、插件扩展机制


    像 @Tran、@Cache 之类的注解开发成果,都会希望能在所有项目中复用。Solon Plugin 是一种解耦的插件扩展机制,简单、弹性、自由。类似 Spring Factories、Java Spi。

    Solon Plugin 机制的核心作用是:获得了应用启动入口,从而可以做一些事情。

    1、Solon Plugin 机制

    • 第一步:定制插件实现类
    //X开头可以让文件排序在未位,方便找到
    public class XPluginImpl implements Plugin{
        @Override
        public void start(SolonApp app) {
            //插件启动时...
        }
    }
    
    • 第二步:通过插件配置文件申明自己,须全局唯一存在

    约定插件配置文件:

    #建议使用包做为文件名,便于识别,且可避免冲突
    META-INF/solon/{packname}.properties
    

    约定插件配置内容:

    #插件实现类配置
    solon.plugin={PluginImpl}  
    #插件优化级配置。越大越优先,默认为0
    solon.plugin.priority=9      
    
    • 第三步:扫描并发现插件

    程序启动时,扫描META-INF/solon/目录下所有的.properties文件,找到所有的插件并排序。

    2、示例参考,插件:solon.extend.aspect

    这个插件提供了 @Dao@Service 扩展注解,进而实现Class的动态代理能力。

    • 插件实现类:src/main/java/org.noear.solon.extend.aspect.XPluginImp.java
    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) -> {
                BeanProxy.binding(bw);
            });
    
            Aop.context().beanBuilderAdd(Service.class, (clz, bw, anno) -> {
                BeanProxy.binding(bw);
            });
        }
    }
    
    
    • 插件配置文件:src/main/resources/META-INF/solon/solon.extend.aspect.properties
    solon.plugin=org.noear.solon.extend.aspect.XPluginImp
    
    • 插件应用示例
    //
    // 引入 org.noear:solon.extend.aspect 插件之后
    //
    
    @Service
    public class AppService {
        @Inject
        SqlMapper sqlMapper1;
    
        //
        // @Service 注解,可为 bean 添加 class 动态代理;进而支持事务注解:@Tran
        //
        @Tran
        public void addApp(){
            sqlMapper1.appx_add();
        }
    }
    
  • 相关阅读:
    开发常用工具
    eclipse官方下载地址
    spring相关下载地址
    Django在windows系统下安装详情
    Python with用法:自动关闭文件原理
    python字符串使用哪种编码格式?
    python浮点数精度问题
    robotframework 自定义库导入 modulenotfounderror
    git 解决 push 时(master|MERGING)
    git撤销对 远程的push&commit提交
  • 原文地址:https://www.cnblogs.com/noear/p/15810964.html
Copyright © 2020-2023  润新知