需求:在实现全局接口的校验的时候,我想到的是,
1.首先为所有的接口创建输入输出参数的bean
2.然后为从aop的切点处获取方法名,参数等,根据SPI 获取相应类,然后转成bean,调用类的检验方法(所有的bean 都实现IBean接口)
3.参数校验通过,再进入方法
接下来研究SPI - Service Provider Interface 服务加载方式
SPI机制的约定
-
在 META-INF/services/ 目录中创建以接口全限定名命名的文件,该文件内容为API具体实现类的全限定名
-
使用 ServiceLoader 类动态加载 META-INF 中的实现类
-
如 SPI 的实现类为 Jar 则需要放在主程序 ClassPath 中
-
API 具体实现类必须有一个不带参数的构造方法
例子:
public interface People { public String speak(); }
public class English implements People{ public String speak() { return "English speak English"; } }
public class Chinese implements People{ public String speak() { return "chinese speak zhongwen"; } }
资源路径下/META-INF.services/(接口类全路径)com.atguigu.gmall.SPI
com.atguigu.gmall.SPI.Chinese com.atguigu.gmall.SPI.English
测试类:
@Test public void testSpi(){ ServiceLoader<People> peoples=ServiceLoader.load(People.class); for (People people:peoples){ System.out.println(people.speak()); } }
结果:
chinese speak zhongwen
English speak English
Dubbo SPI 注解
官网解释:
http://dubbo.apache.org/zh-cn/docs/source_code_guide/dubbo-spi.html
例子:
@SPI public interface People { public String speak(); }
public class English implements People{ public String speak() { return "English speak English"; } }
public class Chinese implements People{ public String speak() { return "chinese speak zhongwen"; } }
资源路径下/META-INF.services/(接口类全路径)com.atguigu.gmall.SPI
chinese=com.atguigu.gmall.SPI.Chinese english=com.atguigu.gmall.SPI.English
测试代码:
@Test public void testDubbo(){ ExtensionLoader<People> extensionLoader= ExtensionLoader.getExtensionLoader(People.class); People chinese = extensionLoader.getExtension("chinese"); System.out.println(chinese.speak()); }