最新SPI都不知道?还敢说懂Dubbo?面试官怼的我哑口无言啊!!!,java面试逻辑思维题及答案

最后

终极手撕架构师的学习笔记:分布式+微服务+开源框架+性能优化

image

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

在这里插入图片描述

为什么要讲SPI呢?因为在Dubbo就用到了SPI机制,所以掌握了这部分对于后面的学习还是很有帮助的。

SPI ,全称为 Service Provider Interface,是一种服务发现机制。它通过在ClassPath路径下的META-INF/services文件夹查找文件,自动加载文件里所定义的类。这一机制为很多框架扩展提供了可能,比如在Dubbo、JDBC中都使用到了SPI机制。我们先通过一个很简单的例子来看下它是怎么用的。

案例介绍

先定义接口项目

在这里插入图片描述

然后创建一个扩展的实现,先导入上面接口项目的依赖

com.bobo

JavaSPIBase

1.0-SNAPSHOT

然后创建接口的实现

/**

  • SPI:MySQL对于 baseURL 的一种实现

*/

public class MySQLData implements BaseData {

@Override

public void baseURL() {

System.out.println(“mysql 的扩展实现…”);

}

}

然后在resources目录下创建 META-INF/services 目录,然后在目录中创建一个文件,名称必须是定义的接口的全类路径名称。然后在文件中写上接口的实现类的全类路径名称。

在这里插入图片描述

同样的再创建一个案例

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hLdPTrbV-1626441864846)(img\image-20210716162539114.png)]

然后在测试的项目中测试

public static void main(String[] args) {

ServiceLoader providers = ServiceLoader.load(BaseData.class);

Iterator iterator = providers.iterator();

while(iterator.hasNext()){

BaseData next = iterator.next();

next.baseURL();

}

}

根据不同的导入,执行的逻辑会有不同

在这里插入图片描述

在这里插入图片描述

源码查看

ServiceLoader

首先来看下ServiceLoader的类结构

// 配置文件的路径

private static final String PREFIX = “META-INF/services/”;

// 加载的服务 类或者接口

private final Class service;

// 类加载器

private final ClassLoader loader;

// 访问权限的上下文对象

private final AccessControlContext acc;

// 保存已经加载的服务类

private LinkedHashMap<String,S> providers = new LinkedHashMap<>();

// 内部类,真正加载服务类

private LazyIterator lookupIterator;

load

load方法创建了一些属性,重要的是实例化了内部类,LazyIterator。

public final class ServiceLoader implements Iterable

private ServiceLoader(Class svc, ClassLoader cl) {

//要加载的接口

service = Objects.requireNonNull(svc, “Service interface cannot be null”);

//类加载器

loader = (cl == null) ? ClassLoader.getSystemClassLoader() : cl;

//访问控制器

acc = (System.getSecurityManager() != null) ? AccessController.getContext() : null;

reload();

Java面试核心知识点笔记

其中囊括了JVM、锁、并发、Java反射、Spring原理、微服务、Zookeeper、数据库、数据结构等大量知识点。

蚂蚁金服(Java研发岗),26岁小伙斩获三面,收获Offer定级P6

Java中高级面试高频考点整理

蚂蚁金服(Java研发岗),26岁小伙斩获三面,收获Offer定级P6

蚂蚁金服(Java研发岗),26岁小伙斩获三面,收获Offer定级P6

最后分享Java进阶学习及面试必备的视频教学

蚂蚁金服(Java研发岗),26岁小伙斩获三面,收获Offer定级P6

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

ejkceKew-1715647614510)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值