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

来源:互联网 发布:广东英特讯软件科技 编辑:程序博客网 时间:2024/06/05 13:25

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


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

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

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

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

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

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


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

内容:

racingCar=com.doctor.spi.service.impl.RacingCarsportCar=com.doctor.spi.service.impl.SportCar

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

注:pom文件中添加依赖:

<dependency><groupId>com.alibaba</groupId><artifactId>cooma</artifactId><version>0.4.0</version></dependency>

并添加作者的仓库地址:

<repository><id>metaframe-repository</id><name>Metaframe Repository</name><url>http://metaframe.github.com/repo</url></repository>


main方法:

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

RacingCar Running...SportCar Running...

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

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


1 0
原创粉丝点击