最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

springBoot?之spring.factories擴(kuò)展機(jī)制示例解析

 更新時間:2023年04月17日 14:36:29   作者:算子  
這篇文章主要為大家介紹了springBoot?之spring.factories擴(kuò)展機(jī)制示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

引言

這個月準(zhǔn)備寫完Spring源碼解析系列文章。我相信大多點(diǎn)進(jìn)來看的同學(xué)們都應(yīng)該或多或少對springBoot的擴(kuò)展機(jī)制有一些了解,我們這次通過八股文歸納法和源碼淺層解析,達(dá)到大家對SpringBoot擴(kuò)展的機(jī)制的理解。全文看完大概三分鐘,希望大家都有收獲,畢竟藝多不壓身,知其然知其所以然。

在Spring Boot中,我們通常會看到一些源碼包的META-INF下又一個文件spring.factories。大家都知道它是一種擴(kuò)展機(jī)制,有的同學(xué)可能在其他博客中看到把它稱之為Spring Boot SPI。為什么這么稱謂呢,后續(xù)我專門分享一篇Java SPI。那么到底它是如何實現(xiàn)spring Boot的擴(kuò)展的呢。在本文中,我們將深入探討這種擴(kuò)展機(jī)制的底層源代碼實現(xiàn),以及我們在源碼上標(biāo)注注釋的形式,共同揭開Spring.factories 的神秘面紗。

1. spring.factories八股總結(jié)

如果只是需要應(yīng)付面試或者只是想大概了解,看完此章節(jié)就可以了

1.1 spring.factories文件格式

在分析spring.factories的底層實現(xiàn)之前,我們需要了解spring.factories文件的格式。spring.factories文件是一個標(biāo)準(zhǔn)的Properties文件,其中鍵是要擴(kuò)展的類型的全限定名,值是要注冊的bean的全限定名。

例如 

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.example.MyAutoConfiguration。

1.2 SpringFactoriesLoader類

SpringFactoriesLoader是一個實用類,它用于加載spring.factories文件并注冊bean定義。以下是SpringFactoriesLoader類的源代碼: loadFactory方法首先使用傳遞的Class對象的名稱作為鍵調(diào)用loadFactories方法來獲取已注冊bean的全限定名列表。然后,它使用Java 8的Stream API將全限定名列表映射到相應(yīng)的Class對象,并使用反射通過無參數(shù)構(gòu)造函數(shù)實例化每個Class對象。最后,它將實例化的對象收集到一個List對象中并返回。

1.3 loadFactories方法

loadFactories方法是SpringFactoriesLoader類的私有方法,它接收一個要擴(kuò)展的類型的Class對象和一個ClassLoader對象,并返回一個包含所有已注冊bean的List對象loadFactories方法首先使用傳遞的Class對象的名稱作為鍵從緩存Map中獲取已注冊bean的全限定名列表。

如果緩存中沒有,則使用傳遞的ClassLoader對象從classpath中獲取所有spring.factories文件的URL,并使用PropertiesLoaderUtils類加載每個文件中的Properties對象。

對于每個Properties對象,它獲取與傳遞的Class對象的名稱相對應(yīng)的屬性值, 在Spring Boot中,spring.factories是一個非常重要的配置文件,它用于實現(xiàn)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文件,并讀取其中定義的屬性。然后,它會根據(jù)這些屬性值加載對應(yīng)的類,并將它們注冊到Spring的ApplicationContext中。

好吧,如上所示是Spring Boot中spring.factories的底層源碼解析: 整個加載過程我們可以大致分為5步.

你也可以理解為咱們整理的為了方便記憶八股文吧 

  • Spring Boot通過SpringFactoriesLoader類來加載spring.factories文件。這個類是Spring框架中的一個工具類,用于加載classpath下的所有spring.factories文件,并將它們的內(nèi)容存儲在一個Map<String, List<String>>對象中。
  • Spring Boot使用SpringFactoriesLoader.loadFactoryNames方法來加載指定屬性名的所有實現(xiàn)類。這個方法會從步驟1中加載的Map<String, List<String>>對象中獲取對應(yīng)屬性名的實現(xiàn)類列表。
  • Spring Boot使用SpringFactoriesLoader.loadFactories方法來加載指定屬性名的所有實現(xiàn)類的實例。這個方法會遍歷步驟2中獲取的實現(xiàn)類列表,并使用反射機(jī)制實例化每一個類。
  • Spring Boot會將步驟3中實例化的類注冊為Spring的Bean。它會調(diào)用AnnotationConfigUtils.registerAnnotationConfigProcessors方法來注冊自動配置類。這個方法會調(diào)用BeanDefinitionRegistryPostProcessor接口的實現(xiàn)類的postProcessBeanDefinitionRegistry方法,來注冊自動配置類的BeanDefinition。
  • Spring Boot會啟動Spring的ApplicationContext,并讓它自動掃描所有的Bean。它會調(diào)用AnnotationConfigApplicationContext.refresh方法來啟動ApplicationContext,并讓它自動掃描所有的Bean。在掃描過程中,Spring會發(fā)現(xiàn)步驟4中注冊的自動配置類,并嘗試自動配置應(yīng)用程序。
/**
 * SpringFactoriesLoader類是Spring框架中的一個工具類,用于加載classpath下的所有spring.factories文件,
 * 并將它們的內(nèi)容存儲在一個Map<String, List<String>>對象中。
 */
public final class SpringFactoriesLoader {
    /**
     * 私有構(gòu)造函數(shù),不允許實例化。
     */
    private SpringFactoriesLoader() {
    }
    /**
     * 加載指定屬性名的所有實現(xiàn)類的類名列表。
     * @param factoryType 屬性名
     * @param classLoader 類加載器
     * @return 類名列表
     */
    public static List<String> loadFactoryNames(Class<?> factoryType, ClassLoader classLoader) {
        // ...
    }
    /**
     * 加載指定屬性名的所有實現(xiàn)類的實例。
     * @param factoryType 屬性名
     * @param classLoader 類加載器
     * @param <T> 實現(xiàn)類的類型
     * @return 實現(xiàn)類的實例列表
     */
    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接口的一個實現(xiàn)類,
 * 用于支持基于Java配置的應(yīng)用程序上下文。
 */
public class AnnotationConfigApplicationContext extends GenericApplicationContext implements AnnotationConfigRegistry {
    /**
     * 啟動ApplicationContext,并讓它自動掃描所有的Bean。
     */
    @Override
    public void refresh() throws BeansException, IllegalStateException {
        // ...
    }
}

好了,今天的內(nèi)容就到這兒了,每天寫點(diǎn)東西整理和總結(jié)。謝謝大家的閱讀。放棄很容易但堅持一定很酷。一起加油

更多關(guān)于springBoot spring.factories擴(kuò)展的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java8的常用時間api實用指南

    Java8的常用時間api實用指南

    這篇文章主要給大家介紹了關(guān)于Java8的常用時間api的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • Java字符串排序的幾種實現(xiàn)方式

    Java字符串排序的幾種實現(xiàn)方式

    這篇文章主要給大家介紹了關(guān)于Java字符串排序的幾種實現(xiàn)方式, 使用Java平臺進(jìn)行字符串排序被認(rèn)為是一件簡單的工作,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07
  • 實戰(zhàn)分布式醫(yī)療掛號通用模塊統(tǒng)一返回結(jié)果異常日志處理

    實戰(zhàn)分布式醫(yī)療掛號通用模塊統(tǒng)一返回結(jié)果異常日志處理

    這篇文章主要為大家介紹了實戰(zhàn)分布式醫(yī)療掛號系統(tǒng)之統(tǒng)一返回結(jié)果統(tǒng)一異常處理,統(tǒng)一日志處理到通用模塊示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2022-04-04
  • 教你如何正確了解java三大特性!!!!

    教你如何正確了解java三大特性!!!!

    所有的面向?qū)ο缶幊陶Z言的思路都是差不多的,而這三大特性,則是思路中的支柱點(diǎn),接下來我就重點(diǎn)講解了一下java三大特性,感興趣的朋友跟隨腳本之家小編一起看看吧
    2021-07-07
  • 解決IDEA?JDK9沒有module-info.java的問題

    解決IDEA?JDK9沒有module-info.java的問題

    這篇文章主要介紹了解決IDEA?JDK9沒有module-info.java的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • SpringBoot中的健康檢查詳解

    SpringBoot中的健康檢查詳解

    這篇文章主要介紹了SpringBoot中的健康檢查詳解,健康檢查是一種用來確保應(yīng)用程序和其所依賴的服務(wù)的狀態(tài)正常的機(jī)制,在本文中,我們將探討SpringBoot中的健康檢查是什么以及如何使用它來監(jiān)視應(yīng)用程序的狀態(tài),需要的朋友可以參考下
    2023-07-07
  • 在SpringBoot中實現(xiàn)一個訂單號生成系統(tǒng)的示例代碼

    在SpringBoot中實現(xiàn)一個訂單號生成系統(tǒng)的示例代碼

    在Spring Boot中設(shè)計一個訂單號生成系統(tǒng),主要考慮到生成的訂單號需要滿足的幾個要求:唯一性、可擴(kuò)展性、以及可能的業(yè)務(wù)相關(guān)性,本文給大家介紹了幾種常見的解決方案及相應(yīng)的示例代碼,需要的朋友可以參考下
    2024-02-02
  • Spring BPP中如何優(yōu)雅的創(chuàng)建動態(tài)代理Bean詳解

    Spring BPP中如何優(yōu)雅的創(chuàng)建動態(tài)代理Bean詳解

    這篇文章主要給大家介紹了關(guān)于Spring BPP中如何優(yōu)雅的創(chuàng)建動態(tài)代理Bean的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Java構(gòu)造方法有什么作用?

    Java構(gòu)造方法有什么作用?

    在本篇文章里小編給大家介紹了關(guān)于Java構(gòu)造方法的作用以及相關(guān)的基礎(chǔ)知識點(diǎn),對此有需要的朋友們可以跟著學(xué)習(xí)下。
    2022-11-11
  • 將idea工程打包成jar文件的全步驟

    將idea工程打包成jar文件的全步驟

    這篇文章主要給大家介紹了關(guān)于將idea工程打包成jar文件的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09

最新評論

洛川县| 安顺市| 余庆县| 大竹县| 温泉县| 阿拉善盟| 兴山县| 永城市| 都兰县| 渑池县| 涪陵区| 靖边县| 区。| 长子县| 长治县| 台中县| 酉阳| 乐亭县| 寻甸| 甘肃省| 镇远县| 色达县| 浦城县| 宁安市| 浑源县| 桐梓县| 双鸭山市| 迁安市| 宁阳县| 惠安县| 广平县| 夹江县| 射阳县| 华阴市| 鱼台县| 娱乐| 阳春市| 涿鹿县| 汨罗市| 财经| 五河县|