前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java SPI机制

Java SPI机制

作者头像
WindWant
发布2020-09-11 11:04:38
2450
发布2020-09-11 11:04:38
举报
文章被收录于专栏:后端码事

Service Provider Interfaces:服务提供发现,动态替换发现的机制

示例:

一个接口:

代码语言:javascript
复制
public interface Calc {
代码语言:javascript
复制
    Logger logger = LoggerFactory.getLogger(Calc.class);
代码语言:javascript
复制
代码语言:javascript
复制
    Object calc(int calcType);
代码语言:javascript
复制
}

两个实现:

计算sin值:

代码语言:javascript
复制
public class SinCalc implements Calc {
代码语言:javascript
复制
    @Override
代码语言:javascript
复制
    public Object calc(int calcType) {
代码语言:javascript
复制
        Object value = Math.sin(calcType);
代码语言:javascript
复制
        logger.info("sin result: {}", value);
代码语言:javascript
复制
        return value;
代码语言:javascript
复制
    }
代码语言:javascript
复制
}
代码语言:javascript
复制
计算开方:
代码语言:javascript
复制
public class SqrtCalc implements Calc {
代码语言:javascript
复制
    @Override
代码语言:javascript
复制
    public Object calc(int calcType) {
代码语言:javascript
复制
        Object value = Math.sqrt(calcType);
代码语言:javascript
复制
        logger.info("sqrt result: {}", value);
代码语言:javascript
复制
        return value;
代码语言:javascript
复制
    }
代码语言:javascript
复制
}

一个服务加载类:

代码语言:javascript
复制
@Component
代码语言:javascript
复制
public class SpiService {
代码语言:javascript
复制
代码语言:javascript
复制
    public Object execCalc(int value){
代码语言:javascript
复制
        ServiceLoader<Calc> loader = ServiceLoader.load(Calc.class);
代码语言:javascript
复制
        Iterator<Calc> iterator = loader.iterator();
代码语言:javascript
复制
        while (iterator.hasNext()) {
代码语言:javascript
复制
            return iterator.next().calc(value);
代码语言:javascript
复制
        }
代码语言:javascript
复制
        return null;
代码语言:javascript
复制
    }
代码语言:javascript
复制
代码语言:javascript
复制
    public static void main(String[] args) {
代码语言:javascript
复制
        new SpiService().execCalc(100);
代码语言:javascript
复制
    }
代码语言:javascript
复制
}

一个配置文件

classpath:META-INF/services/xxx.xxx.Calc

内容:需要加载的功能类

如:xxx.xxx.SqrtCalc

代码语言:javascript
复制
#org.windwant.spring.core.spi.service.SinCalc
org.windwant.spring.core.spi.service.SqrtCalc
#org.windwant.spring.core.spi.service.LogCalc

则 运行服务加载类执行,输出计算开方。

示例应用项目:https://github.com/windwant/spring-dubbo-service

官方文档:https://docs.oracle.com/javase/tutorial/sound/SPI-intro.html

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-01-24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档