网站做图尺寸大小,做外国网站用什么服务器,中文单页面网站模板,网站建设技术文档一、什么是SPI
Java SPI#xff08;Service Provider Interface#xff09;是Java官方提供的一种服务发现机制。 它允许在运行时动态地加载实现特定接口的类#xff0c;而不需要在代码中显式地指定该类#xff0c;从而实现解耦和灵活性。
二、实现原理
基于 Java 类加载…一、什么是SPI
Java SPIService Provider Interface是Java官方提供的一种服务发现机制。 它允许在运行时动态地加载实现特定接口的类而不需要在代码中显式地指定该类从而实现解耦和灵活性。
二、实现原理
基于 Java 类加载机制和反射机制。 #mermaid-svg-S18RlXekD3J1crwU {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-S18RlXekD3J1crwU .error-icon{fill:#552222;}#mermaid-svg-S18RlXekD3J1crwU .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-S18RlXekD3J1crwU .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-S18RlXekD3J1crwU .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-S18RlXekD3J1crwU .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-S18RlXekD3J1crwU .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-S18RlXekD3J1crwU .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-S18RlXekD3J1crwU .marker{fill:#333333;stroke:#333333;}#mermaid-svg-S18RlXekD3J1crwU .marker.cross{stroke:#333333;}#mermaid-svg-S18RlXekD3J1crwU svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-S18RlXekD3J1crwU .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-S18RlXekD3J1crwU .cluster-label text{fill:#333;}#mermaid-svg-S18RlXekD3J1crwU .cluster-label span{color:#333;}#mermaid-svg-S18RlXekD3J1crwU .label text,#mermaid-svg-S18RlXekD3J1crwU span{fill:#333;color:#333;}#mermaid-svg-S18RlXekD3J1crwU .node rect,#mermaid-svg-S18RlXekD3J1crwU .node circle,#mermaid-svg-S18RlXekD3J1crwU .node ellipse,#mermaid-svg-S18RlXekD3J1crwU .node polygon,#mermaid-svg-S18RlXekD3J1crwU .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-S18RlXekD3J1crwU .node .label{text-align:center;}#mermaid-svg-S18RlXekD3J1crwU .node.clickable{cursor:pointer;}#mermaid-svg-S18RlXekD3J1crwU .arrowheadPath{fill:#333333;}#mermaid-svg-S18RlXekD3J1crwU .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-S18RlXekD3J1crwU .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-S18RlXekD3J1crwU .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-S18RlXekD3J1crwU .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-S18RlXekD3J1crwU .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-S18RlXekD3J1crwU .cluster text{fill:#333;}#mermaid-svg-S18RlXekD3J1crwU .cluster span{color:#333;}#mermaid-svg-S18RlXekD3J1crwU div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-S18RlXekD3J1crwU :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 存在 开始 加载服务 ServiceLoader.load, 参数Class 检测META-INF/services文件夹 是否存在 接口全限定名命名 的文件 获取文件内 实现类的全限定名 反射创建 结束 三、优点
松耦合性具有很好的松耦合性可以在运行时动态加载实现类而无需在编译时将实现类硬编码到代码中。扩展性可以为同一个接口定义多个实现类使应用程序更容易扩展和适应变化。易于使用只需要定义接口并指定实现类的类名即可轻松地使用新的服务提供者。
四、使用 我的服务 新建接口
这个接口要给SPI实现者
package com.example.demo;
public interface Phone {void print();
}使用
public static void main(String[] args) {ServiceLoaderPhone phones ServiceLoader.load(Phone.class);for (Phone phone:phones) {phone.print();}
}这是时候我们还没有任何实现类。 所以ServiceLoader是加载不到的。 我们需要另一个服务去实现配置Phone接口并引入另一个服务的依赖。 其他的服务实现接口 另一个服务实现配置Phone接口
package com.example.demo2;public class HuaweiPhone implements Phone {Overridepublic void print() {System.out.println(遥遥领先);}
}
实现接口2
package com.example.demo2;
public class XiaomiPhone implements Phone{Overridepublic void print() {System.out.println(Are you ok?);}
}在META-INF/services创建配置
创建com.example.demo.Phone的文件 内容 com.example.demo2.HuaweiPhone com.example.demo2.XiaomiPhone