Motan源码解析(一)SPI机制实现分析

Motan使用SPI机制来实现模块间的访问,基于接口和name来获取实现类,降低了模块间的耦合。

首先来看一下使用方式:

有两个注解


@Documented

@Retention(RetentionPolicy.RUNTIME)

@Target({ElementType.TYPE})

public @interface Spi {

    Scope scope() default Scope.PROTOTYPE;

}

@Documented

@Retention(RetentionPolicy.RUNTIME)

@Target({ElementType.TYPE})

public @interface SpiMeta {

    String name() default "";

}

@Spi用来注解接口,@SpiMeta用来注解接口的实现类

源码中示例:


@Spi(scope = Scope.SINGLETON)

public interface ConfigHandler {

@SpiMeta(name = MotanConstants.DEFAULT_VALUE)

public class SimpleConfigHandler implements ConfigHandler {

Motan Spi机制遵循JDK的spi机制,在META-INF/services/下面配置实现类的描述。

文件:META-INF/services/com.weibo.api.motan.config.handler.ConfigHandler


com.weibo.api.motan.config.handler.SimpleConfigHandler

具体的使用方式是:


ConfigHandler configHandler = ExtensionLoader.getExtensionLoader(ConfigHandler.class).getExtension(MotanConstants.DEFAULT_VALUE);

根据接口类型获取ExtensionLoader,根据想要的实现的名字获取实现类。这里并没有直接new 实现类,而是根据@SpiMeta上的name来获取实现类。类似于工厂模式,给你一个名字,给我一个实现类对象。而且还可以在@Spi注解中配置对象的创建是否是单例的。


public enum Scope {

    /**

    * 单例模式

    */

    SINGLETON,

    /**

    * 多例模式

    */

    PROTOTYPE

}

ExtensionLoader的源码分析

其主要思路就是通过io操作读取classpath下的相应文件(/META-INF/xxxx),并进行解析,反射得到接口的实现类,并调用newInstance()创建实例。如果他是单例,就将其缓存,如果不是单例则无需缓存直接返回。@SpiMeta打在接口上,用来标识其生命周期。@Spi打在实现类上,通过name属性作为唯一引用标识,即可打通xml的配置和具体的实现。

image.png

欢迎大家扫码关注我的微信公众号,与大家一起分享技术与成长中的故事。


我的微信公众号.jpg

你可能感兴趣的:(Motan源码解析(一)SPI机制实现分析)