咱們基於ExtensionLoader.getExtensionLoader().getAdaptiveExtension()這個入口進行了源碼分析,已經經過上一節課進行了分析。我也作了很詳細的筆記給你們去作鞏固,但願你們有去學習源碼分析
簡單整理一下上節課getAdaptiveExtension的流程圖學習
injectExtensionspa
還記得咱們在講解@Adaptive的時候提到過的AdaptiveCompiler類嗎?這個類裏面有一個setDefaultCompiler方法,他自己沒有實現compile。而是基於DEFAULT_COMPILER。而後加載指定擴展點進行動態調用。那麼這個DEFAULT_COMPILER這個值,就是在injectExtension方法中進行注入的。簡單看看對象
在injectExtension這個方法中,咱們發現入口出的代碼首先判斷了objectFactory這個對象是否爲空。這個是在哪裏初始化的呢?實際上咱們在得到ExtensionLoader的時候,就對objectFactory進行了初始化。blog
而後經過ExtensionLoader.getExtensionLoader(ExtensionFactory.class).getAdaptiveExtension()去得到一個自適應的擴展點,進入ExtensionFactory這個接口中,能夠看到它是一個擴展點,而且有一個本身實現的自適應擴展點AdaptiveExtensionFactory;接口
咱們能夠看到除了自定義的自適應適配器類之外,還有兩個實現類,一個是SPI,一個是Spring,AdaptiveExtensionFactoryget
AdaptiveExtensionFactory輪詢這2個,從一箇中獲取到就返回。源碼