【源起Netty 外传】ServiceLoader详解

本文深入剖析ServiceLoader机制,演示如何利用ServiceLoader实现跨jar包获取接口实现类,展示其延时加载特性,通过实例代码和调用流程,揭示ServiceLoader的工作原理。

【源起Netty 外传】ServiceLoader详解

 

 1.5k 次阅读  ·  读完需要 7 分钟

前戏

netty源码注释有云:

...

If a provider class has been installed in a jar file that is
visible to the system class loader, and that jar file contains a
provider-configuration file named
<tt>java.nio.channels.spi.SelectorProvider</tt> in the resource
directory <tt>META-INF/services</tt>, then the first class name
specified in that file is taken.  The class is loaded and
instantiated; if this process fails then an unspecified error is
thrown.

...

不知所云?好吧,重点是,jar文件中在META-INF/services目录下配置了A属性,以某种方式能加载到。

how can do that? 答曰:ServiceLoader

摸索

ServiceLoader直译为服务加载器,最终目的是获取service的impl实现类。正如前文所说,它将加载META-INF/services下的配置文件,来锁定impl实现类。

  • 代码走起

1.首先,要有一个接口

//形状接口
public interface Shape {
    String introduce(); //介绍
}

2.然后,要有该接口的实现类。实现类很简单,介绍自己的形状是啥

//实现类一
public class Circle implements Shape {
    public String introduce() {
        return "圆形";  //言简意赅的介绍
    }
}
//实现类二
public class Sequare implements Shape {
    static{
        System.out.println("【Sequare】据说有延时加载,try it..");
    }
    public String introduce() {
        return "方形";
    }
}

眼尖的朋友可能已经注意到了,这里有个静态块,因为资料中有提到ServiceLoader有延时加载的效果。寡人不信,遂验之……

3.配置文件,放在META-INF/services

文件位置:

- src
    -main
        -resources
            - META-INF
                - services
                    - xxxpackage.Shape

文件名:包名.接口名

文件内容:包名.接口实现类,换行符分隔

xxxpackage.Circle
xxxpackage.Sequare

4.ServiceLoader调用

ServiceLoader<Shape> shapeLoader = ServiceLoader.load(Shape.class);
Iterator<Shape> it = shapeLoader.iterator();
while(it.hasNext()){
    System.out.println("Iterator<Shape> next()方法调用..");
    Shape shape = it.next();
    System.out.printf("what's shape?%s\n",shape.introduce());
}

调用结果:

Iterator<Shape> next()方法调用..
【Sequare】据说有延时加载,try it..
what's shape?方形

从该结果可看出,在调用it.next()的时候,才真正的加载了Sequare类,确确实实是延时加载。期具体实现依靠ServiceLoader的内部类LazyIterator,感性趣的朋友可以自己看一下。

总结

  1. ServiceLoader重点在于可跨越jar包获取impl,这一点笔者通过maven多模块项目亲测ok
  2. 延时加载特性
基于可靠性评估序贯蒙特卡洛模拟法的配电网可靠性评估研究(Matlab代码实现)内容概要:本文围绕“基于可靠性评估序贯蒙特卡洛模拟法的配电网可靠性评估研究”,介绍了利用Matlab代码实现配电网可靠性的仿真分析方法。重点采用序贯蒙特卡洛模拟法对配电网进行长时间段的状态抽样与统计,通过模拟系统元件的故障与修复过程,评估配电网的关键可靠性指标,如系统停电频率、停电持续时间、负荷点可靠性等。该方法能够有效处理复杂网络结构与设备时序特性,提升评估精度,适用于含分布式电、电动汽车等新型负荷接入的现代配电网。文中提供了完整的Matlab实现代码与案例分析,便于复现和扩展应用。; 适合人群:具备电力系统基础知识和Matlab编程能力的高校研究生、科研人员及电力行业技术人员,尤其适合从事配电网规划、运行与可靠性分析相关工作的人员; 使用场景及目标:①掌握序贯蒙特卡洛模拟法在电力系统可靠性评估中的基本原理与实现流程;②学习如何通过Matlab构建配电网仿真模型并进行状态转移模拟;③应用于含新能接入的复杂配电网可靠性定量评估与优化设计; 阅读建议:建议结合文中提供的Matlab代码逐段调试运行,理解状态抽样、故障判断、修复逻辑及指标统计的具体实现方式,同时可扩展至不同网络结构或加入更多不确定性因素进行深化研究。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值