motan系列2——SPI机制
motan的SPI机制
motan整个项目由SPI机制贯穿起来。主要理解几个概念:
两个注解:@Spi主要于可扩展的接口,类似于模板模式,定义一个标准,可以自定义扩展;@SpiMeta作用于扩展类,可以定义名称,实例化方式(单例和原型)
另外有一个核心实现类 ExtensionLoader<T>,这个类的作用就是获取扩展类示例的。看下这个类的几个核心属性:
//管理的是由@Spi
注解标注的接口与其ExtensionLoader
的映射,作为所有SPI的全局管理器。
private static ConcurrentMap<Class<?>, ExtensionLoader<?>> extensionLoaders = new ConcurrentHashMap<Class<?>, ExtensionLoader<?>>();
//维护了当前ExtensionLoader
中的单例扩展。
private ConcurrentMap<String, T> singletonInstances = null;
//维护了当前ExtensionLoader
所有扩展实例的Class对象,用于创建多例(通过class.newInstance创建)。 private ConcurrentMap<String, Class<T>> extensionClasses = null; //维护了当前@Spi
注解标注的接口的class
对象。 private Class<T> type; private volatile boolean init = false; // spi path prefix private static final String PREFIX = "META-INF/services/"; private ClassLoader classLoader;