在了解Spring boot自動裝配原理之前夹抗,需要了解兩個很重要的知識點Java SPI機制和Spring的Import注解断凶,把這兩個重要的點理解清楚之后就很容易理解Spring boot的自動裝配原理了空猜,并且能很好的應(yīng)用到實際項目中湾盗。?前言SPI(Service Provider Interface)崇渗,是JDK內(nèi)置的一種?服務(wù)提供發(fā)現(xiàn)機制旋廷,可以用來啟用框架擴展和替換組件泳唠,主要是被框架的開發(fā)人員使用狈网,比如java.sql.Driver接口,其他不同廠商可以針對同一接口做出不同的實現(xiàn)警检,MySQL和PostgreSQL都有不同的實現(xiàn)提供給用戶孙援,而Java的SPI機制可以為某個接口尋找服務(wù)實現(xiàn)。Java中SPI機制主要思想是將裝配的控制權(quán)移到程序之外扇雕,在模塊化設(shè)計中這個機制尤其重要拓售,其核心思想就是?解耦。大家最熟悉的的應(yīng)用場景有Common-Logging镶奉,JDBC等础淤。?JDK實現(xiàn)1崭放、定義SPI接口 2、SPI接口的多個實現(xiàn) ? 3鸽凶、在classpath下創(chuàng)建META-INF/services/目錄币砂,并且在該目錄下創(chuàng)建一個文件配置文件com.qd.demo.spi.AnimalSPI(該文件名為SPI接口全路徑) ? 文件中的內(nèi)容為SPI接口具體的實現(xiàn)類(可多個)4、通過jdk中ServiceLoader讀取配置文件對SPI實現(xiàn)類形式實例化 ? 通過該過程可以了解到SPI是面向接口編程玻侥,不關(guān)注接口的具體實現(xiàn)决摧,由配置文件配置具體要實例化的廠商接口。JDK也提供了具體的實現(xiàn)凑兰,我們一起來看看ServiceLoader是如何實現(xiàn)的掌桩,通過load方法跟入JDK源碼(以下至列出核心代碼)。 ? ? 重點關(guān)注PREFIX = "META-INF/services/"姑食、hasNextService方法和nextService方法波岛,首先在classpath下的META-INF/services/找到SPI接口classname的對應(yīng)的配置文件,然后將其所有配置的類讀取到configs中音半,在通過反射的方式對配置的bean進行實例化则拷,由此就解開了SPI 對應(yīng)bean的具體實例化過程。 不足: 不能按需加載曹鸠,需要遍歷配置文件中所有的實現(xiàn)并實例化煌茬。 不能很直接的獲取某個實例化對象,只能通過迭代的形式獲取彻桃。 ?非線程安全宣旱。 Spring 實現(xiàn)Spring主要通過SpringFactoriesLoader來進行實現(xiàn) ? ? Spring通過classpath下META-INF/spring.factories配置文件,找到需要實例化的類進行實例化叛薯,其讀取配置文件方式與jdk一致,但是比jdk更優(yōu)勢的地方是能指定bean進行實例化笙纤,如截圖就指定了BeanInfoFactory的實例化子類為ExtendedBeanInfoFactory耗溜。