您好,登錄后才能下訂單哦!
本篇內容主要講解“springBoot之spring.factories擴展機制是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“springBoot之spring.factories擴展機制是什么”吧!
在分析spring.factories的底層實現之前,我們需要了解spring.factories文件的格式。spring.factories文件是一個標準的Properties文件,其中鍵是要擴展的類型的全限定名,值是要注冊的bean的全限定名。
例如
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.example.MyAutoConfiguration。
SpringFactoriesLoader是一個實用類,它用于加載spring.factories文件并注冊bean定義。以下是SpringFactoriesLoader類的源代碼: loadFactory方法首先使用傳遞的Class對象的名稱作為鍵調用loadFactories方法來獲取已注冊bean的全限定名列表。然后,它使用Java 8的Stream API將全限定名列表映射到相應的Class對象,并使用反射通過無參數構造函數實例化每個Class對象。最后,它將實例化的對象收集到一個List對象中并返回。
loadFactories方法是SpringFactoriesLoader類的私有方法,它接收一個要擴展的類型的Class對象和一個ClassLoader對象,并返回一個包含所有已注冊bean的List對象loadFactories方法首先使用傳遞的Class對象的名稱作為鍵從緩存Map中獲取已注冊bean的全限定名列表。
如果緩存中沒有,則使用傳遞的ClassLoader對象從classpath中獲取所有spring.factories文件的URL,并使用PropertiesLoaderUtils類加載每個文件中的Properties對象。
對于每個Properties對象,它獲取與傳遞的Class對象的名稱相對應的屬性值, 在Spring Boot中,spring.factories
是一個非常重要的配置文件,它用于實現Spring Boot的自動化配置。這個文件位于META-INF/spring.factories
路徑下,通常可以在項目的classpath下找到。
spring.factories
文件的格式如下所示:
# Auto Configuration org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.example.MyAutoConfiguration
這個文件中定義了一個名為org.springframework.boot.autoconfigure.EnableAutoConfiguration
的屬性,它的值是一個類的完全限定名,即com.example.MyAutoConfiguration
。這個類通常是一個Spring配置類,用于定義一些自動化配置。
Spring Boot在啟動時會掃描classpath中的所有spring.factories
文件,并讀取其中定義的屬性。然后,它會根據這些屬性值加載對應的類,并將它們注冊到Spring的ApplicationContext中。
好吧,如上所示是Spring Boot中spring.factories
的底層源碼解析: 整個加載過程我們可以大致分為5步
.
你也可以理解為咱們整理的為了方便記憶八股文吧
Spring Boot通過SpringFactoriesLoader
類來加載spring.factories
文件。這個類是Spring框架中的一個工具類,用于加載classpath下的所有spring.factories
文件,并將它們的內容存儲在一個Map<String, List<String>>
對象中。
Spring Boot使用SpringFactoriesLoader.loadFactoryNames
方法來加載指定屬性名的所有實現類。這個方法會從步驟1中加載的Map<String, List<String>>
對象中獲取對應屬性名的實現類列表。
Spring Boot使用SpringFactoriesLoader.loadFactories
方法來加載指定屬性名的所有實現類的實例。這個方法會遍歷步驟2中獲取的實現類列表,并使用反射機制實例化每一個類。
Spring Boot會將步驟3中實例化的類注冊為Spring的Bean。它會調用AnnotationConfigUtils.registerAnnotationConfigProcessors
方法來注冊自動配置類。這個方法會調用BeanDefinitionRegistryPostProcessor
接口的實現類的postProcessBeanDefinitionRegistry
方法,來注冊自動配置類的BeanDefinition。
Spring Boot會啟動Spring的ApplicationContext,并讓它自動掃描所有的Bean。它會調用AnnotationConfigApplicationContext.refresh
方法來啟動ApplicationContext,并讓它自動掃描所有的Bean。在掃描過程中,Spring會發現步驟4中注冊的自動配置類,并嘗試自動配置應用程序。
/** * SpringFactoriesLoader類是Spring框架中的一個工具類,用于加載classpath下的所有spring.factories文件, * 并將它們的內容存儲在一個Map<String, List<String>>對象中。 */ public final class SpringFactoriesLoader { /** * 私有構造函數,不允許實例化。 */ private SpringFactoriesLoader() { } /** * 加載指定屬性名的所有實現類的類名列表。 * @param factoryType 屬性名 * @param classLoader 類加載器 * @return 類名列表 */ public static List<String> loadFactoryNames(Class<?> factoryType, ClassLoader classLoader) { // ... } /** * 加載指定屬性名的所有實現類的實例。 * @param factoryType 屬性名 * @param classLoader 類加載器 * @param <T> 實現類的類型 * @return 實現類的實例列表 */ public static <T> List<T> loadFactories(Class<T> factoryType, ClassLoader classLoader) { // 省略 ... } }
/** * AnnotationConfigUtils類提供了一些用于處理注解配置的工具方法。 */ class AnnotationConfigUtils { /** * 注冊自動配置類。 * @param registry Bean定義注冊器 */ public static void registerAnnotationConfigProcessors(BeanDefinitionRegistry registry) { // ... } }
/** * AnnotationConfigApplicationContext類是Spring的ApplicationContext接口的一個實現類, * 用于支持基于Java配置的應用程序上下文。 */ public class AnnotationConfigApplicationContext extends GenericApplicationContext implements AnnotationConfigRegistry { /** * 啟動ApplicationContext,并讓它自動掃描所有的Bean。 */ @Override public void refresh() throws BeansException, IllegalStateException { // ... } }
到此,相信大家對“springBoot之spring.factories擴展機制是什么”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。