栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

提高项目可扩展性的java spi机制运用-自定义日志框架

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

提高项目可扩展性的java spi机制运用-自定义日志框架

1. 理论参考 2. 案例提供一个简单的日志框架myslf4j

  • ①定义核心接口
public interface MySlf4j {

    void log(String msg);

}
  • ②定义一个默认实现(有些框架不一定给默认实现,如果用户也引入厂商的实现就报错,这里还是给个默认实现比较好)
public class MySlf4jDefaultImpl implements MySlf4j {
    @Override
    public void log(String msg) {
        System.out.println("MySlf4j的默认实现MySlf4jDefaultImpl:"+msg);
    }
}
  • ③resources/meta-INF/services/下载配置这个实现,ServiceLoader#load()方法就会加载里面的实现。如上图,文件名为接口名 ,内容为实现类全路径,加载时会通过放射实例化
  • ④再写一个类来获取MySlf4j的实现进行,以便使用MySlf4j的现在
public class LogFactory {
    public static MySlf4j getFirstLogger(){
        List allImpls = getProviders();// 如果引入2个厂商实现,且在maven中优先引入B实现,则这里加载到的是B的实现(maven就近原则也许就是这么玩的)
        return allImpls.get(0);
    };

    public static MySlf4j getLastLogger(){
        List allImpls = getProviders();
        return allImpls.get(allImpls.size()-1);//要最后一个加载的
    }
    public static List getAllLogger(){ //默认及所有厂商实现都要
        return getProviders();
    }
    private static List getProviders() {
        ServiceLoader providers = ServiceLoader.load(MySlf4j.class);
        Iterator it = providers.iterator();
        List allImpls = new ArrayList<>();
        while (it.hasNext()) {
            allImpls.add(it.next());
        }
        return allImpls;
    }

    ;
}
3.测试框架

就改项目mvn install到本地maven仓库,再在业务项目引入my-slf4j进行日志打印


   com.xxx
    my-slf4j
    1.0-SNAPSHOT

测试my-slf4j

4.厂商jwolf实现
  • ①厂商实现需要先引入my-slf4j定义的接口

   com.xxx
    my-slf4j
    1.0-SNAPSHOT

  • ②自己实现MySlf4j接口
public class JwolfMySlf4j implements MySlf4j {
    @Override
    public void log(String msg) {
        System.out.println("Jwolf厂商实现JwolfMySlf4j:"+msg);
    }
}
  • ③注册实现,注意文件名仍然为com.xx.MySlf4j 实现写Jwolf自己的实现的类全路径
5.业务项目同时引入my-slf4j,及其厂商实现jwolfmyslf4j,且my-slf4j先引入,则优先加载的是my-slf4j

6.交换my-slf4j,及其厂商实现jwolfmyslf4j引入顺序,providers加载顺序也变了



总结

  • 本案例利用spi机制实现了类似原生slf4j的日志框架,my-slf4j具有可扩展性,具体厂商实现具有可插拔性
  • 多个实现时的加载顺序有点类似maven的就近原则,最短路径原则
  • 使用该机制可实现市面上有些框架类似的plugin就可以利用spi实现,插件制造者实现统一的接口,并将包放入plugin下吗,serviceload就可加载。只是这些plugin在项目外,需要配置外置jar包加载路径
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/459036.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号