本文简单介绍下如何使用,具体原理,暂时不做深究。
定义c 通达信行情接口,接口和实现
/**
* 每次都要手动创建实现指定文件,比较繁琐。
结果
Java中,可以通过ServiceLoader类比较方便的找到该类的所有子类实现。META-INF/services下的实现指定和实现子类实现完全可以和c 通达信行情接口,接口定义完全分开。
如何获取某个c 通达信行情接口,接口的实现?
c 通达信行情接口,接口
*
* Created: 2018/5/27 上午10:36
* Project: tech-validation
*
* @author houbinbin
* @version 1.0
* @since JDK 1.7
*/
public interface Say {
/**
* 说
*/
void say();
}
package com.github.houbb.forname.impl;
import com.github.houbb.forname.Say;
/**
* SPI的解决方式
jar的引入
com.google.auto.service
auto-service
1.0-rc4
true
简单总结
项目源码
简单总结
*
* Created: 2018/5/27 上午10:37
* Project: tech-validation
*
* @author houbinbin
* @version 1.0
* @since JDK 1.7
*/
public class DefaultSay implements Say {
@Override
public void say() {
System.out.println('Default say');
}
}
麻烦的地方
以前一直想指定一套标准,让别人按照这个标准来实现,并编写好对应的容器。然后我在代码中动态获取这些实现,让代码运行起来。类似于写个windows环境,让开发者自己开发对应的软件。
困难
c 通达信行情接口,接口和定义
/**
* c 通达信行情接口,接口
*
* Created: 2018/5/27 上午10:36
* Project: tech-validation
*
* @author houbinbin
* @version 1.0
* @since JDK 1.7
*/
public interface Sing {
/**
* 唱歌
*/
void sing();
}
@AutoService(Sing.class)
public class DefaultSing implements Sing {
@Override
public void sing() {
System.out.println('Sing a song...');
}
}
初步方案和同事讨论,是通过扫描包的class的方式。然后判断是否为定制标准的子类。缺点觉得很别扭,需要限定死实现类的包名称,而且性能也较差。
简单实现
.
├── java
│ └── com
│ └── github
│ └── houbb
│ └── forname
│ ├── Say.java
│ ├── Sing.java
│ └── impl
│ ├── DefaultSay.java
│ └── DefaultSing.java
└── resources
└── META-INF
└── services
└── com.github.houbb.forname.Say
测试
public class SayTest {
@Test
public void spiTest() {
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
ServiceLoader loader = ServiceLoader.load(Say.class, classLoader);
for (Say say : loader) {
say.say();
}
}
}
问题引入
通过google的auto,可以在编译时自动为我们生成对应的c 通达信行情接口,接口实现指定文件。在target对应的文件下可以看到。
Auto就为解决这个问题而生。
今天在阅读hibernate-validator源码时受到了启发。可以通过SPI的方式,更加自然的解决这个问题。
测试
public class SingTest {
@Test
public void spiTest() {
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
ServiceLoader loader = ServiceLoader.load(Sing.class, classLoader);
for (Sing sing : loader) {
sing.sing();
}
}
}
测试结果
编写services实现指定
Auto版本
文章为作者独立观点,不代表股票交易接口观点