Dubbo SPI机制简介

SPI (service Provider Interface,是一种面向接口的编程方式。一个接口经常有多个实现类,通过SPI机制发现接口的实现服务。当服务的提供者,需要在META-INF/services下创建接口对应的文件,之后通过java提供的serviceLoader加载对应的实现,并装载实例化。

SPI demo:



package org.dubbo.demo.spi;
/**
 * java spi接口。
 * @author pc
 *
 */
public interface HelloService {

	String hello(String name);
}
package org.dubbo.demo.spi.impl;

import org.dubbo.demo.spi.HelloService;
/**
 * helloService实现类。
 * @author pc
 *
 */
public class DefaultHelloService implements HelloService{

	@Override
	public String hello(String name) {
		// TODO Auto-generated method stub
		return name +" "+"default";
	}

}
package org.dubbo.demo.spi.impl;

import org.dubbo.demo.spi.HelloService;
/**
 * HelloService实现类。
 * @author pc
 *
 */
public class ConsumerHelloService implements HelloService {

	@Override
	public String hello(String name) {
		// TODO Auto-generated method stub
		return name + " "+"consumer";
	}

}
配置文件。
org.dubbo.demo.spi.impl.DefaultHelloService
org.dubbo.demo.spi.impl.ConsumerHelloService
测试。

package org.dubbo.demo.spi;

import java.util.ServiceLoader;

public class SpiTest {
	
	final ServiceLoader<HelloService> serverLoader = ServiceLoader.load(HelloService.class);
	
	public static void main(String[] args){
		SpiTest test =new  SpiTest();
		ServiceLoader<HelloService> services = test.serverLoader;
		for(HelloService  service: services){
			System.out.println(service.hello("hello"));
		}
	}
}

java ServiceLoader加载类的不足:

1 , 通过load加载所有的实现类,实现所有的实现类消耗资源。

2 , iterator迭代遍历,不能获取到某个特定的类,加载机制不够灵活。

dubbo扩展了java 的SPI机制。
1 , 添加了获取任意实现类的方法。

2 , 提供了AOP和IOC的支持。

3 , dubbo提供了wrapper自动包装的方式。(装饰者模式)

dubbo规定了放置扩展点配置⽂件 META-INF/dubbo/接⼝全限定名作为SPI的配置文件,类实现配置文件:配置名=扩展实现类全限定名。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值