第1节 ExtensionLoader核心方法
方法名 | 修饰关键字 | 作用 |
ExtensionLoader | private | 私有构造函数,只被getExtensionLoader()方法调用,保证加载器对象是单例的 |
loadLoadingStrategies | private static | 利用Java SPI机制创建LoadingStragegy接口的所有实现类的对象数组 |
withExtensionAnnation | private static | 用于检查接口是否带有@SPI注解 |
findClassLoader | private static | 获取class加载器 |
getExtensionLoader | public static | 获取SPI接口的加载器对象,如果对象不存在构建新对象,并存在EXTENSION_LOADS静态表中 |
getDefaultExtension | public | 获取默认的SPI接口的实现对象 |
getExtension | public | 按照名字获取SPI接口的实现对象 |
getSupportedExtensionInstances | public | 获取写入SPI配置文件的所有的SPI接口的实现对象 |
getAdaptiveExtension | public | 获取objectFactory实现对象,会触发调用createAdaptiveExtension()方法 |
getAdaptiveExtensionClass | private | 获取objectFactory的实现类 |
createAdaptiveExtension | private | 创建objectFactory实现对象 |
getExtensionClasses | private | 获取SPI接口的实现类的映射表,会触发调用loadExtensionClassess()方法 |
loadExtensionClasses | private | 根据SPI配置加载实现类 |
loadDirectory | private | 从指定的META-INF目录下加载实现类 |
loadResource | private | 从指定的jar包内部SPI配置文件加载实现类 |
loadClass | private | 加载SPI接口的实现类 |
第2节 getExtensionLoader()的调用过程
方法的详细调用过程如下图
第3节 getExtensionClasses()的调用过程
方法的详细调用过程如下图
执行完getExtensionClasses()方法之后,ExtensionLoader<T>对象的状态如下
type=T.class
objectFactory=null
cachedAdaptiveClass=null或者AdaptiveExtensionFactory.class
cachedDefaultName=null或者@SPI注解指定的value值
cachedNames:
ImplClass1.class name1
ImplClass2.class name2
等等
cachedClasses:
name1 ImplClass1.class
name2 ImplClass2.class
等等
第4节 getAdaptiveExtension()的调用过程
方法的详细调用过程如下图
执行完成之后,ExtensionLoader<ExtensionFactory>对象的状态如下
type=ExtensionFactory.class
objectFactory=null
cachedAdaptiveClass=AdaptiveExtensionFactory.class
cachedAdaptiveInstance持有AdaptiveExtensionFactory对象
cachedDefaultName=null,(ExtensionFactory接口定义的@SPI注解没有指定value值)
cachedNames:
SpringExtensionFactory.class spring
SpiExtensionFactory.class spi
cachedClasses:
spring SpringExtensionFactory.class
spi SpiExtensionFactory.class
第5节 getDefaultExtension()的调用过程
方法的详细调用过程如下图
主要执行过程如下:
1)首先调用getExtensionClasses(),确保已加载实现类
2)通过反射创建instace
3)IOC注入依赖
4)编排AOP执行顺序
5)执行初始化