人狠话不多,先上截图和代码吧。
这是工程目录。看到resources目录下面没有,添加了META-INF和services目录。
添加了一个com.gys.test.IAnimal文件。这个文件名和上面的接口名完全对应。这个目录的文件名是有讲究的,按照SPI规范来的。
上代码:
package com.gys.test; public interface IAnimal { void eat(); }
package com.gys.test.impl; import com.gys.test.IAnimal; public class Bird implements IAnimal { @Override public void eat() { System.out.println("小鸟吃虫子"); } }
package com.gys.test.impl; import com.gys.test.IAnimal; public class Dog implements IAnimal { @Override public void eat() { //System.out.println("小狗吃屎"); System.out.println("小狗吃骨头"); } }
package com.gys.test; import java.util.ServiceLoader; public class MainTest { public static void main(String[] args) { ServiceLoader<IAnimal> animals=ServiceLoader.load(IAnimal.class); for (IAnimal animal:animals){ animal.eat(); } } }
ServiceLoader.load(clsss)就是去ClassPath的MEAT-INF的service下去寻找指定文件;这里的classPath包括外部引入的jar包中的classPath.
如果我们引入了第三方的jar包,如果jar中的META-INF/service有com.gys.test.IAnimal文件,也会被读取,并且实例化里面的类。
自己提供接口让别人提供实现的方式;典型的如JDBC模式。
以上就是浅谈Java的SPI技术的详细内容,更多关于JAVA SPI技术的资料请关注我们其它相关文章!
时间:2020-07-18
效果如下: C#实现代码 using Android.App; using Android.OS; using Android.Widget; namespace SpinnerDemo { [Activity(Label = "@string/ApplicationName", MainLauncher = true, Icon = "@drawable/icon")] public class MainActivity : Activity { private
RPC,即 Remote Procedure Call(远程过程调用),说得通俗一点就是:调用远程计算机上的服务,就像调用本地服务一样. RPC 可基于 HTTP 或 TCP 协议,Web Service 就是基于 HTTP 协议的 RPC,它具有良好的跨平台性,但其性能却不如基于 TCP 协议的 RPC.会两方面会直接影响 RPC 的性能,一是传输方式,二是序列化. 众所周知,TCP 是传输层协议,HTTP 是应用层协议,而传输层较应用层更加底层,在数据传输方面,越底层越快,因此,在一般情况下
前言 Spire系列库中已发布的Java产品目前有三个,即Spire.PDF for Java.Spire.Presentation for Java.Spire.Barcode for Java.使用该Java产品,除了可以从官网:https://www.e-iceblue.cn/Downloads.html下载,也可以通过Maven来安装使用.本教程中,以通过Maven安装Spire.PDF for Java为例介绍具体安装方法和步骤. 首先,在pom.xml文件中配置Maven仓库路径.
JAVA SPI 简介 SPI 是 Java 提供的一种服务加载方式,全名为 Service Provider Interface.根据 Java 的 SPI 规范,我们可以定义一个服务接口,具体的实现由对应的实现者去提供,即服务提供者.然后在使用的时候再根据 SPI 的规范去获取对应的服务提供者的服务实现.通过 SPI 服务加载机制进行服务的注册和发现,可以有效的避免在代码中将具体的服务提供者写死.从而可以基于接口编程,实现模块间的解耦. SPI 机制的约定 1 在 META-INF/serv
Spire.Cloud.Excel Sdk 提供GeneralApi接口和WorkbookApi接口,支持将本地Excel和云端Excel文档转换为ODS, PDF, XPS, PCL, PS等格式.本文以将Excel表格转为PDF为例,介绍实现格式转换的步骤及方法. 所需工具:Spire.Cloud.Excel.Sdk 必要步骤: 步骤1:Jar文件下载及导入.可通过"下载中心"下载获取jar:或者通过maven仓库安装导入,具体参考安装方法. 步骤2:ID及Key获取.需要在云端创
SPI的全名为:Service Provider Interface,大多数开发人员可能不熟悉,因为这个是针对厂商或者插件的.在java.util.ServiceLoader的文档里有比较详细的介绍. 简单的总结下 Java SPI 机制的思想.我们系统里抽象的各个模块,往往有很多不同的实现方案,比如日志模块的方案,xml解析模块.jdbc模块的方案等.面向的对象的设计里,我们一般推荐模块之间基于接口编程,模块之间不对实现类进行硬编码. 一旦代码里涉及具体的实现类,就违反了可拔插的原则,如果需要
JDK有个ServiceLoader类,在java.util包里,支持按约定目录/META-INF/services去找到接口全路径命名的文件,读取文件内容得到接口实现类的全路径,加载并实例化.如果我们在自己的代码中定义一个接口,别人按接口实现并打包好了,那么我们只需要引入jar包,通过ServiceLoader就能够把别人的实现用起来.举个例子,JDK中的JDBC提供一个数据库连接驱动接口,不同的厂商可以有不同的实现,如果它们给的jar包里按规定提供了配置和实现类,那么我们就可以执行不同的数据
C#端 using System; using System.IO; using System.Security.Cryptography; namespace 计算文件的MD5值 { class MD5_Helper { /// <summary> /// 文件MD5校验 /// </summary> /// <param name="pathName">文件绝对路径</param> /// <returns>MD5校验码&
前言 首先介绍一下什么叫做相对路径和绝对路径,我们程序狗家族想必都是懂这个的,但是难免会有童鞋忘记.所以码出来供大家快速回忆一下. 相对路径 相对路径是相对于文件当前的工作路径而言的 绝对路径 绝对路径是由文件名和它的完整路径以及驱动器字母组成的,如果是Windows系统,那么某一个文件的绝对路径可能是: c:/pythonworkspace/firstpy.py 在Unix平台上,文件的绝对路径可能是: /home/sherlockblaze/Documents/pythonworkspace
本文实例讲述了java编写的简单移动方块小游戏代码.分享给大家供大家参考,具体如下: 运行效果截图如下: 第一次用java编写图形化的界面,还是有些青涩..以后继续努力!!具体代码如下: //Little Box Game by AlexYui //Game.java By 1093710210@ HIT import javax.swing.*; import java.awt.event.*; import java.awt.geom.*; import java.awt.*; import
大家都知道我们在提交form的时候用了多种input表单.可是不是每一种input表单都是很简单的用Document.getElementById的方式就可以获取到的.有一些组合的form类似于checkbox或者radio或者select我们如何用javascript获取和在服务器中获取提交过来的参数呢? 多说无用.上代码: Jsp-html代码: <form action="input.do" name="formkk"> <table>
在常见的ORM框架中,大都提供了使用注解方式来实现entity与数据库的映射,这里简单地使用自定义注解与反射来生成可执行的sql语句. 这是整体的目录结构,本来是为复习注解建立的项目^.^ 好的,首先我们来确定思路. 1. 自定义@Table @Column注解, 我们稍微模仿hibernate,让@Table作用于类上,来表明实体类与数据表的映射关系,且让@Table中的属性value映射为数据表的名称tableName:让@Column作用于属性上(这里没实现作用于set方法上),表明属性与
Java 详解单向加密--MD5.SHA和HMAC及简单实现实例 概要: MD5.SHA.HMAC这三种加密算法,可谓是非可逆加密,就是不可解密的加密方法. MD5 MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致.MD5是输入不定长度信息,输出固定长度128-bits的算法. MD5算法具有以下特点: 1.压缩性:任意长度的数据,算出的MD5值长度都是固定的. 2.容易计算:从原数据计算出MD5值很容易. 3.抗修改性:对原数据进行任何
效果: 代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="
下面分享的是一个Java多线程模拟停车场系统的小实例(Java的应用还是很广泛的,哈哈),具体代码如下: Park类 public class Park { boolean []park=new boolean[3]; public boolean equals() { return true; } } Car: public class Car { private String number; private int position=0; public Car(String number)
本文的实例是Java编程实现一个数字时钟,代码测试可用,练练手吧.代码如下: package me.socketthread; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.util.Calendar; import java.util.GregorianCalenda
微信小程序之网络请求简单封装实例详解 在微信小程序中实现网络请求相对于Android来说感觉简单很多,我们只需要使用其提供的API就可以解决网络请求问题. 普通HTTPS请求(wx.request) 上传文件(wx.uploadFile) 下载文件(wx.downloadFile) WebSocket通信(wx.connectSocket) 为了数据安全,微信小程序网络请求只支持https,当然各个参数的含义就不在细说,不熟悉的话可以:可以去阅读官方文档的网络请求api,当我们使用request