小工具      在线工具  汉语词典  css  js  c++  java

Java SPI 学习

Java 额外说明

收录于:43天前

服务提供商接口:服务提供商接口。

在面向对象的设计中,我们一般建议模块之间采用基于接口的编程方式,模块之间不要硬编码实现类。

一旦代码中涉及到具体的实现类,就违反了可插拔性原则。如果需要替换实现,则需要修改代码。

为了实现模块组装而不需要在程序中动态指定,需要服务发现机制。

Java SPI 提供了这样一种机制:一种查找某个接口的服务实现的机制。

这有点类似于IOC的思想,即将汇编的控制权移到程序之外。

JavaSPI实际上是一种“基于接口编程+策略模式+配置文件”组合实现的动态加载机制。

1.首先定义一个接口LJSPIService

package com.robinboot.service;

/**
 * @Auther: TF12778
 * @Date: 2020/3/27 16:56
 * @Description:
 */
public interface LJSPIService {

    public void prinfMessage();
}

2、基于接口LJSPIService编写两个实现类:LJPrintfSPIService和LJSoutSPIService

package com.robinboot.service.service.Impl;

import com.robinboot.service.LJSPIService;

/**
 * @auther: TF12778
 * @date: 2020/3/27 16:58
 * @description:
 */
public class LJSoutSPIService implements LJSPIService {

    @Override
    public void prinfMessage() {
        System.out.println("SoutSPIService prinfMessage");
    }
}
package com.robinboot.service.service.Impl;

import com.robinboot.service.LJSPIService;

/**
 * @auther: TF12778
 * @date: 2020/3/27 16:57
 * @description:
 */
public class LJPrintfSPIService implements LJSPIService {

    @Override
    public void prinfMessage() {
        System.out.println("PrintfSPIService prinfMessage");
    }
}

3、配置文件

创建 META-INF.services 包并添加接口 LJSPIService 的完全限定名称文件。内容就是上面的实现类,如下:

4. 测试

 @Test
    public void SPITest() {
        ServiceLoader<LJSPIService> s = ServiceLoader.load(LJSPIService.class);
        Iterator<LJSPIService> iterator = s.iterator();
        while (iterator.hasNext()) {
            LJSPIService search =  iterator.next();
            search.prinfMessage();
        }
    }

检测结果:

. . .

相关推荐

额外说明

Redis(5)——哈希数据类型

目录 前言 保存Hash数据(hset) 获取指定对象key中对应属性key的Hash数据(hget) 不覆盖设置(hsetnx) 批量设置多个属性(hmset) 获取某个对象所有key对应的值(hmget) 判断某个指定对象的某个属性是否存在(hexi

额外说明

Springboot添加server.servlet.context-path相关使用总结

一、server.servlet.context-path配置的作用 定义: server.servlet.context-path= # Context path of the application. 应用的上下文路径,也可以称为项目路径,是构成ur

额外说明

Redis连接springboot项目中的不同库

springboot项目中redis连接不同的库 创建不同的RedisConnectionFactory对象 @Configuration public class RedisConfig { @Bean(name = "redisDb1Con

额外说明

面试问题:数据量大(亿级)时,es如何提高查询效率?

面试题 es 在数据量很大的情况下(数十亿级别)如何提高查询效率啊? 面试官心理分析 这个问题是肯定要问的,说白了,就是看你有没有实际干过 es,因为啥?其实 es 性能并没有你想象中那么好的。很多时候数据量大了,特别是有几亿条数据的时候,可能你会懵逼的

额外说明

java坦克大战心得

创建窗口  创建一个窗体类,继承Frame,(也可以不继承使用JFrame),然后在该类的构造函数中,使用Frame中的方法,设置窗体的标题,大小,位置,可显,不可改变窗体大小(注意:可以使用Toolkit方法获取屏幕的高宽; 也可以直接写窗口的大小;s

额外说明

Java基础 第二节 第十二课

抽象类 概述 由来 定义 abstract 使用格式 抽象方法 抽象类 抽象的使用 注意事项 概述 由来 父类中的方法, 被它的子类们重写. 子类各自实现都不尽相同. 那么父类的方法声明和方法主体, 只有声明还有意义, 而方法主体则没有存在的意义了. 我

额外说明

C语言第三课-----------加油 加油 加油

作者前言  欢迎小可爱们前来借鉴我的gtiee秦老大大 (qin-laoda) - Gitee.com 目录 数组 操作符 常见关键字 ________________________________________ 紧接上一课,上一篇博客我已经简单介绍

额外说明

[Ext JS 7]7.4 样式主题(Theme)

Theming 样式 集中、统一修改元素样式 可以在不同的应用中重用. 框架本身默认提供的主题样式包括: 构建自定义的Theme Theme是Cmd包的一种类型, 在Ext JS中, 所有类型的包都可以包含JS、CSS以及资源文件, 主题包包含了这些类型

额外说明

由于找不到d3dx9_35.dll文件导致游戏软件无法运行启动的问题

其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个d3dx9_35.dll文件

额外说明

解决api-ms-win-crt-time-l1-1-0.dll在Windows没有找到问题

其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或者损坏了,这时你只需下载这个api-ms-win-crt-time-l1-1-0.dll文

ads via 小工具