会员登录 - 用户注册 - 设为首页 - 加入收藏 - 网站地图 字节面试也会问SPI机制?!

字节面试也会问SPI机制?

时间:2025-11-05 13:40:45 来源:益强数据堂 作者:系统运维 阅读:581次

​1.前言

Java SPI 机制,字节主要是面试类加载器反双亲委派的实现(第三方包不在指定jdk路径,一般类加载器无法加载,机制需要特殊的字节ContextClassLoader加载以便使用)。本次将对 SPI机制进行详解,面试并结合案例介绍其在实际场景中具体使用。机制

提示:以下是字节本篇文章正文内容,案例仅供对比参考

2.什么是面试SPI机制?

SPI(全称:Service Provider Interface),是机制jdk内置的一种服务提供发现接口机制,旨在由第三方服务实现或扩展为组件,字节方便开发人员快速集成指定扩展组件满足指定的面试需求。这对于应用或平台扩展来说,机制无疑是字节一种成本较低、动态灵活的面试方案。SPI机制调度过程(业务调用方可根据加载的机制扩展实现类实现功能)调用流程

3.实现方式及使用场景

鉴于目前实际项目涉及范围,总结出的常见应用场景。

3.1 接口权限定文件名方式

即在resource文件下创建META/services/目录,并在此目录下新建文件,文件名称为接口类权限定文件名,如 com.lgy.spidemo.serviceway.SpiService。(不好理解就是接口类的云南idc服务商package地址 + 接口类名)

使用场景一:

场景描述:不同部门类型的员工需要从不同的考勤应用获取出勤信息,如职能部门仅拉取钉钉考勤,业务部门需要拉取钉钉考勤的基础上再结合自研考勤模块数据汇总出勤结果。实现方式:抽象通用拉取考勤接口,定义不同部门人员考勤统计实现类。直接上代码:通用接口:package com.lgy.spidemo.serviceway;

/

**

* @description: 考勤接口

**/

public interface AttendanceService {

void pullAttendanceInfos();

}职能部门考勤实现类;/

**

* @description: 职能部门考勤实现

**/

public class FunctionAttendanceServiceImpl implements AttendanceService {

@Override

public void pullAttendanceInfos() {

System.out.println(" FunctionAttendanceService implements ...");

// 逻辑忽略

}

}销售部门考勤实现;/

**

* @description: 销售部门考勤实现

**/

public class SaleAttendanceServiceImpl implements AttendanceService {

@Override

public void pullAttendanceInfos() {

System.out.println(" SaleAttendanceService implements ...");

// 逻辑忽略

}

}测试类; /

**

* 1、项目的\src\main\resources\下创建\META-INF\services目录

* 2、META-INF\services的目录下再增加一个配置文件,这个文件必须以接口的全限定类名保持一致 (com.lgy.spidemo.service.SpiService)

* 3、在配置文件中写入具体实现类的全限定类名,如有多个便换行写入 com.lgy.spidemo.service.impl.SaleAttendanceServiceImpl

com.lgy.spidemo.service.impl.FunctionAttendanceServiceImpl

**/

public class AttendanceServiceTest {

public static void main(String[] args) {

ServiceLoader services =

ServiceLoader.load(AttendanceService.class);

// 省略判断人员部门类型逻辑

// 测试输出结果,展示实现接口已加载

for (AttendanceService service : services) {

service.pullAttendanceInfos();

}

}

}

测试结果如下;// 两个实现类均被加载成功,在实际使用时,可根据需要去调用不同的实现。

FunctionAttendanceService implements ...

SaleAttendanceService implements ....

实现类不要标注任何注解,不然Spring在初始化过程中扫描并加载,无法测试。

结合场景一分析:

此场景可以通过自定义实现类的方式满足业务需求(不同部门的考勤规则),有助于业务实现快速迭代,同时也提升了服务架构的可拓展性。考虑公司组织架构比较复杂,部门职责分的云服务器比较细,后续扩展几率比较大,比如职能部门行政类和运营类标准细分,很可能会增加除了考勤之外的各种考核指标等,借鉴此方案可能简单实现并比较方便集成,使得业务间减少依赖,实现解耦的设计模式,因此个人是比较偏向用此方案。其它应用:如项目中常用的日志也是采用SPI机制,常见的common-logging的LogFatory就是标准SPI接口,有兴趣的可以自行研究。3.2 spring.factories方式和上面一样,需要在resource文件下创建META/services/目录,并在此目录下新建文件,区别在于文件名为spring.factories。

使用场景二

场景描述:针对于不同的开发端使用习惯展示不同的接口文档,比如APP端习惯于Swagger,JAVA端喜欢dateway风格,就在不同实例展示不同接口文档。此场景是我臆想出来。实现方式:构建两种版本的高防服务器jar包,比如 1.0.0-swagger 、2.0.0-dataway,再对应的包内配置spring.factories内的config配置类。

代码如下:

package com.lgy.spidemo.factoriesway;

import org.springframework.boot.autoconfigure.AutoConfigurationImportEvent;

import org.springframework.boot.autoconfigure.AutoConfigurationImportListener;

/

**

* @description: 自动配置swagger

**/

public class SwaggetAutoConfiguration {

public SwaggetAutoConfiguration() {

System.out.println(" SwaggetAutoConfiguration init ...");

}

// 配置内容省略

}

/

**

* @description: 自动配置dataway

**/

public class DataWayAutoConfiguration {

public DataWayAutoConfiguration() {

System.out.println(" DataWayAutoConfiguration init ...");

}

// 配置内容省略

}

/

**

* resource/META-INFO/spring.factories 文件内容

*

* org.springframework.boot.autoconfigure.EnableAutoConfiguration=\

com.lgy.spidemo.factoriesway.SwaggetAutoConfiguration

* 输出结果:SwaggetAutoConfiguration init ...

**/根据spring.factories内配置的类,在springboot启动初始化过程中会自动加载对应的配置,实现所需的接口文档。

结合场景二分析:

spring.factories实现机制与上述方式一致,只是实现方式不同,本质目的是通过抽象化类的方式,实现解耦,最终便于扩展其它使用场景:如spring-boot-autoconfigure-x.x.x.RELEASE.jar,就是通过此方式完成初始化加载。

4.总结

本次讲解的两种方式均是基于SPI机制,可见是多么受开发追捧。当然,还有很多种实现方式,我个人觉得最主要的还是能够在自己的掌控范围内去使用,毕竟有问题可以通过自己的学习理解去解决。

最后说一句,没有更好的技术知识,只有更适合的技术应用,结合实际,检出真理。

(责任编辑:IT科技类资讯)

推荐内容
  • 智能手机都拥有一些平滑地融入手机外观的天气小插件,现在幸亏有了 Flair Weather Conky,你便可以在你的 Linux 桌面中拥有像智能手机一样的天气外观。我们将使用一个 GUI 工具Conky Manager 在 Linux 中轻松地管理 Conky。那就先让我们看看如何在 Ubuntu 14.10,14.04、Linux Mint 17 及其他 Linux 发行版本中安装 Conky Manager 吧。安装 Conky Manager打开一个终端并使用下面的命令:复制代码代码如下: sudo add-apt-repository ppa:teejee2008/ppa    sudo apt-get update    sudo apt-get install conky-manager 确保 curl 已被安装请确保 curl 已被安装。假如没有安装它,可以使用下面的命令来安装:复制代码代码如下:sudo apt-get install curl下载 Flair Weather Conky从下面的链接下载 Flair Weather Conky 的脚本:        下载 Flair Weather Conky 的脚本在 Conky Manager 中使用 Flair Weather Conky 脚本步骤 1:同你在 Ubuntu 14.04 中安装主题一样,在你的家目录中应该有一个 .conky 目录。假如你使用命令行,我想我不需要告诉你如何找到这个目录。对于新手,请用文件管理器切换到你的家目录下,并按 Ctrl+H 来 在 Ubuntu 中显示隐藏文件。在这里查找 .conky 文件夹,假如没有这个文件夹,则创建一个。步骤 2:在 .conky 目录中,解压下载到的 Flair Weather 文件。请注意在默认情况下它会自动解压到一个名为 .conky 目录下。所以请进入这个目录,将其中的 Flair Weather 文件夹从中取出,然后将它粘贴到真正的 .conky 目录下。步骤 3:Flair Weather 使用 Yahoo 的天气服务,但它不能自动地识别你的位置。你需要手动地编辑它。到Yahoo 天气 网页,然后通过键入你的城市/Pin 码来得到你所在城市的位置 ID号。你可以从网页地址栏中取得位置 ID 号。步骤 4:打开 Conky Manager,它应该能够读取新安装的 Conky 脚本。这里有两款样式可用,黑色主题或亮丽主题。你可以选择你偏爱的那一款。当你选择后,你就可以在桌面上看到 conky 的显示了。在 Flair Weather 中,默认位置被设定为 Melbourne。你必须手动编辑 conky 文件来修改。步骤 5:在上面的截图中,你可以看到有一个编辑选定 conky 脚本的选项,在打开的编辑器中,查找 location 或 WOEID ,更换它为你在 步骤 3 中得到的位置 ID 号。然后重启 Conky。在上面查找的相同位置,假如你将u=c 替换为u=f,则温度的单位将从摄氏温标改为华氏温标 。不要忘了重启 Conky 来查看已经做出的修改。可能的故障排除在 Ubuntu 14.04 和 Ubuntu 14.10 中,假如你发现 Conky 展示的时间有重叠现象,则请编辑 conky 脚本。查找下面的这些行:复制代码代码如下:## cairo-compmgr    own_window_type override    own_window_argb_visual no然后将内容更换为下面的这些行:复制代码代码如下:## cairo-compmgr    own_window_type dock    own_window_argb_visual no保存更改并重启 conky。这就应该解决了这个问题。感谢 Jesse(这个 Conky 脚本的开发者)给我们提供了这个解决方法和为其他相关问题给予的支持。尝试一下在该文中,我们实际上学到了不少东西。我们见证了如何轻松地使用任何 Conky 脚本,如何编辑脚本以及如何使用 Conky Manager 来达到不同的目的。我希望这些对你有用。需要留心的是,Ubuntu 14.10 用户可能会看到重叠的时间数字。请在开发者 Jesse 绝妙的Google + 主页 中报告任何相关的问题。我已经向你展示了在我的系统上 Flair Weather conky 外观的截图。现在是该你尝试它并炫耀你的桌面的时间了。
  • 以惠普电脑U盘装系统教程(详细教你如何使用惠普电脑U盘安装操作系统)
  • 华为Mate9464(征服未来,华为Mate9464开启智慧新纪元)
  • 金豆子x9(领跑时代的技术创新与卓越性能)
  • 探究一米辅导的优势和特点(一米辅导在提升学习效果中的关键因素)
  • 尼康85mm1.8g镜头——专业摄影的选择(一款性价比高的人像摄影利器)
热点内容