当前位置:   article > 正文

java SPI 与cooma(dubbo 微容器改良品)--2 之Cooma SPI

java SPI 与cooma(dubbo 微容器改良品)--2 之Cooma SPI

java SPI 与cooma(dubbo 微容器改良品)--2 之Cooma SPI


     Cooma是一个极简、灵活的开源Java微容器(microcontainer)实现,其实现源于dubbo的spi(它来源于java spi)。

让我们看一下简单的demo:
概念:Extension Point,扩展点,要扩展的接口。提倡面向接口的编程,这些接口定义就变成了扩展点,凡是我们要扩展的实现,或者可由第三方扩展和替换组件件实现的接口定义,都可称之为扩展点。

  1. package com.doctor.spi.service;
  2. import com.alibaba.cooma.Extension;
  3. /**
  4. * @author sdcuike
  5. *
  6. * Created on 2016年7月24日 下午10:21:37
  7. *
  8. * Extension Point,扩展点,要扩展的接口。提倡面向接口的编程,这些接口定义就变成了扩展点。
  9. */
  10. @Extension
  11. public interface Car {
  12. void run();
  13. }

概念:扩展,即扩展点的实现。一般框架提供几种扩展即接口的实现,并且我们可以自由扩展或替换框架的实现(dubbo很熟悉的话,这点会体会深刻)。

  1. package com.doctor.spi.service.impl;
  2. import com.doctor.spi.service.Car;
  3. /**
  4. * @author sdcuike
  5. *
  6. * Created on 2016年7月24日 下午10:22:28
  7. *
  8. * Extension,扩展,即扩展点的实现
  9. */
  10. public class RacingCar implements Car {
  11. @Override
  12. public void run() {
  13. System.out.println("RacingCar Running...");
  14. }
  15. }

  1. package com.doctor.spi.service.impl;
  2. import com.doctor.spi.service.Car;
  3. /**
  4. *
  5. * @author sdcuike
  6. *
  7. * Created on 2016年7月24日 下午10:23:11
  8. *
  9. * Extension,扩展,即扩展点的实现
  10. */
  11. public class SportCar implements Car {
  12. @Override
  13. public void run() {
  14. System.out.println("SportCar Running...");
  15. }
  16. }


扩展点配置文件:在类路径的META-INF/extensions/添加文件 com.alibaba.demo.cooma.Car:

内容:

  1. racingCar=com.doctor.spi.service.impl.RacingCar
  2. sportCar=com.doctor.spi.service.impl.SportCar

其实,我们可以把它看作spring的xml配置文件,这些文件定义了bean的name和class属性,目的是为了反射实例化,并且根据name依赖注入。

注:pom文件中添加依赖:

  1. <dependency>
  2. <groupId>com.alibaba</groupId>
  3. <artifactId>cooma</artifactId>
  4. <version>0.4.0</version>
  5. </dependency>

并添加作者的仓库地址:

  1. <repository>
  2. <id>metaframe-repository</id>
  3. <name>Metaframe Repository</name>
  4. <url>http://metaframe.github.com/repo</url>
  5. </repository>


main方法:

  1. package com.doctor.spi;
  2. import com.alibaba.cooma.ExtensionLoader;
  3. import com.doctor.spi.service.Car;
  4. /**
  5. * Cooma SPI Demo
  6. *
  7. * @author sdcuike
  8. *
  9. * Created on 2016年7月25日 下午10:11:49
  10. *
  11. * @see https://github.com/alibaba/cooma/wiki
  12. */
  13. public class CoomaDemo {
  14. public static void main(String[] args) {
  15. // ExtensionLoader维护扩展点实现实例的 单例,即getExtension方法对于同一个扩展点实现名返回的实例是同一个。
  16. // 是不是和spring容器中by name获取容器中的bean实例差不多。
  17. // 这个使用方式可以通过扩展点实现名获得 单个接口的指定实现。
  18. ExtensionLoader<Car> extensionLoader = ExtensionLoader.getExtensionLoader(Car.class);
  19. Car racingCar = extensionLoader.getExtension("racingCar");
  20. racingCar.run();
  21. Car sportCar = extensionLoader.getExtension("sportCar");
  22. sportCar.run();
  23. }
  24. }
运行结果:

  1. RacingCar Running...
  2. SportCar Running...

是不是有点类似spring手动实例化容器,按name获取bean实例的思路。

待续。。依赖注入如何实现。。。


本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号