资讯专栏INFORMATION COLUMN

【源起Netty 外传】ServiceLoader详解

MoAir / 504人阅读

摘要:答曰摸索直译为服务加载器,最终目的是获取的实现类。代码走起首先,要有一个接口形状接口介绍然后,要有该接口的实现类。期具体实现依靠的内部类,感性趣的朋友可以自己看一下。总结重点在于可跨越包获取,这一点笔者通过多模块项目亲测延时加载特性

前戏

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
java.nio.channels.spi.SelectorProvider in the resource
directory META-INF/services, 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 shapeLoader = ServiceLoader.load(Shape.class);
Iterator it = shapeLoader.iterator();
while(it.hasNext()){
    System.out.println("Iterator next()方法调用..");
    Shape shape = it.next();
    System.out.printf("what"s shape?%s
",shape.introduce());
}

调用结果:

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

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

总结

ServiceLoader重点在于可跨越jar包获取impl,这一点笔者通过maven多模块项目亲测ok

延时加载特性

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/68287.html

相关文章

  • 源起Netty 外传】System.getPropert()详解

    摘要:阅读源码时,发现很多,理所当然会想翻阅资料后,该技能,姿势如下环境中的全部属性全部属性注意如果将本行代码放在自定义属性之后,会不会打出把自定义属性也给获取到可以结论会获取目前环境中全部的属性值,无论系统提供还是个人定义系统提供属性代码中定义 阅读源码时,发现很多System.getProperty(xxx),理所当然会想:whats fucking this? 翻阅资料后,Get该技能...

    lixiang 评论0 收藏0
  • 源起Netty 外传】FastThreadLocal怎么Fast?

    摘要:实现原理浅谈帮助理解的示意图中有一属性,类型是的静态内部类。刚刚说过,是一个中的静态内部类,则是的内部节点。这个会在线程中,作为其属性初始是一个数组的索引,达成与类似的效果。的方法被调用时,会根据记录的槽位信息进行大扫除。 概述 FastThreadLocal的类名本身就充满了对ThreadLocal的挑衅,快男FastThreadLocal是怎么快的?源码中类注释坦白如下: /** ...

    gxyz 评论0 收藏0
  • 源起Netty 外传】ScheduledThreadPoolExecutor源码解读

    引言 本文是源起netty专栏的第4篇文章,很明显前3篇文章已经在偏离主题的道路上越来越远。于是乎,我决定:继续保持…… 使用 首先看看源码类注释中的示例(未改变官方示例逻辑,只是增加了print输出和注释) import java.time.LocalTime; import java.util.concurrent.Executors; import java.util.concurrent....

    funnyZhang 评论0 收藏0
  • 源起Netty 外传】ScheduledThreadPoolExecutor源码解读

    引言 本文是源起netty专栏的第4篇文章,很明显前3篇文章已经在偏离主题的道路上越来越远。于是乎,我决定:继续保持…… 使用 首先看看源码类注释中的示例(未改变官方示例逻辑,只是增加了print输出和注释) import java.time.LocalTime; import java.util.concurrent.Executors; import java.util.concurrent....

    Eastboat 评论0 收藏0
  • 源起Netty 外传】ScheduledThreadPoolExecutor源码解读

    引言 本文是源起netty专栏的第4篇文章,很明显前3篇文章已经在偏离主题的道路上越来越远。于是乎,我决定:继续保持…… 使用 首先看看源码类注释中的示例(未改变官方示例逻辑,只是增加了print输出和注释) import java.time.LocalTime; import java.util.concurrent.Executors; import java.util.concurrent....

    Martin91 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<