spring 中的种种原理
试一下echo spi
猜测: 这种运行时的技术一般是反射来搞腚的, 这个也不例外. 常见的一般是注解技术, 运行时获取注解.
Service Provider Interface, 是Java提供的一套用来被第三方实现或者扩展的API.
使用如下
- 接口
public interface IEcho {
void echo(String s);
}
- resources/META-INF/services 目录新增一个beer.zeer.IEcho文件
beer.zeer.IEcho
- 实现
public class Echo implements IEcho {
@Override
public void echo(String s) {
if(s.equals("ping"))
System.out.println("pong");
}
}
public class Main {
public static void main(String[] args) {
ServiceLoader<IEcho> clazz = ServiceLoader.load(IEcho.class);
for (IEcho e : clazz ) {
e.echo("ping");
}
}
}
spi 原理
- ServiceLoader.load获得ServiceLoader
- 执行类的装载
- 找类的fullname PREFIX = “META-INF/services/” + service.getName()
- Class.forName(fullname)并且实例化
- 缓存到providersList <ServiceProvider> (因此之前有读缓存的实现)
spring哪些类用到spi
- spring-web-5.2.12.RELEASE (log)
- spring-web-5.2.12.RELEASE (mvc)
- …