国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

1024程序員節(jié)特輯:【Spring Boot自動(dòng)配置原理揭秘】

這篇具有很好參考價(jià)值的文章主要介紹了1024程序員節(jié)特輯:【Spring Boot自動(dòng)配置原理揭秘】。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

1024程序員節(jié)特輯:【Spring Boot自動(dòng)配置原理揭秘】,# Spring Boot,spring boot,后端,java,自動(dòng)配置,源碼閱讀文章來源地址http://www.zghlxwxcb.cn/news/detail-715312.html

主頁傳送門:?? 傳送

概述


??Spring Boot 是一個(gè)用于創(chuàng)建獨(dú)立的、生產(chǎn)級(jí)別的 Spring 應(yīng)用程序的框架。它極大地簡化了 Spring 應(yīng)用程序的開發(fā)過程,其中一個(gè)關(guān)鍵的功能就是自動(dòng)配置(Auto-Configuration)。

??自動(dòng)配置可以根據(jù)項(xiàng)目需求自動(dòng)配置各種服務(wù)和組件,它可以幫助開發(fā)者在不需要顯式配置的情況下,快速地構(gòu)建一個(gè)運(yùn)行的應(yīng)用程序。

??自動(dòng)配置是 Spring Boot 的一個(gè)核心特性,它通過分析項(xiàng)目的依賴和環(huán)境,自動(dòng)地為應(yīng)用程序配置 Spring 配置文件。這意味著開發(fā)者無需手動(dòng)配置大量的 Spring Bean,Spring Boot 會(huì)根據(jù)環(huán)境和項(xiàng)目的依賴來智能地為應(yīng)用程序創(chuàng)建所需的 Bean。

原理


??Spring Boot的自動(dòng)配置原理基于Java的反射機(jī)制和Spring的IoC容器。它通過讀取項(xiàng)目中的配置文件(如application.properties或application.yml),根據(jù)配置信息自動(dòng)創(chuàng)建和配置各種服務(wù)。

可以概括為以下幾個(gè)步驟:

Spring Boot Starter


??Spring Boot 項(xiàng)目通常依賴于所謂的 “Starters”,這是一組預(yù)定義了常用庫的依賴集合。Starters 包含了應(yīng)用程序所需的所有依賴,比如 Web Starter 會(huì)包含用于構(gòu)建 Web 應(yīng)用程序的所有必要庫。

spring.factories 文件


??在每個(gè) Starter 的 META-INF/spring.factories 文件中,定義了一系列的自動(dòng)配置類。這些自動(dòng)配置類會(huì)在應(yīng)用程序啟動(dòng)時(shí)被 Spring Boot 自動(dòng)掃描和加載。

@ConditionalOnX 注解


??在自動(dòng)配置類中,通常會(huì)使用 @ConditionalOnX 注解來控制該自動(dòng)配置是否生效。這個(gè)注解會(huì)根據(jù)特定的條件(比如類是否在類路徑中、特定的 Bean 是否存在等)來決定是否應(yīng)用這個(gè)配置。

配置 Bean


??自動(dòng)配置類會(huì)定義一些必要的 Bean,并使用 @Configuration 注解將它們標(biāo)記為配置類。這些 Bean 會(huì)在 Spring 上下文中被自動(dòng)注冊(cè)。

配置屬性


??自動(dòng)配置類還可以通過讀取 application.propertiesapplication.yml 文件中的屬性來自定義它們的行為。這樣,開發(fā)者可以根據(jù)需要進(jìn)行定制。

源碼剖析


Spring Boot 應(yīng)用的啟動(dòng)類一般均位于src/main/java根路徑下

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

復(fù)合Annotation


??@SpringBootApplication開啟組件掃描和自動(dòng)配置,而SpringApplication.run則負(fù)責(zé)啟動(dòng)引導(dǎo)應(yīng)用程序。@SpringBootApplication是一個(gè)復(fù)合Annotation,它將三個(gè)有用的注解組合在一起:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
        @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
        @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
    // ...省略內(nèi)容
}

??@SpringBootConfiguration就相當(dāng)于@Configuration,它是 Spring 框架的注解,標(biāo)明該類是一個(gè)JavaConfig配置類。而@ComponentScan啟用組件掃描。

@EnableAutoConfiguration


??@EnableAutoConfiguration注解表示開啟 Spring Boot 自動(dòng)配置功能,Spring Boot 會(huì)根據(jù)應(yīng)用的依賴、自定義的 bean、classpath 下有沒有某個(gè)類 等等因素來猜測(cè)你需要的 bean,然后注冊(cè)到 IOC 容器中。
??@EnableAutoConfiguration是如何推算出需求的?首先來看下它的定義:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(EnableAutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
    // ...省略內(nèi)容
}

??重點(diǎn)關(guān)注點(diǎn)@Import({AutoConfigurationImportSelector.class}) @Import注解用于導(dǎo)入類,并將這個(gè)類作為一個(gè) bean 的定義注冊(cè)到容器中,這里它將把EnableAutoConfigurationImportSelector作為 bean 注入到容器中,而這個(gè)類會(huì)將所有符合條件的@Configuration 配置都加載到容器中。

??查看EnableAutoConfigurationImportSelector代碼可以看到:

AutoConfigurationImportSelector


??AutoConfigurationImportSelector 實(shí)現(xiàn)了DeferredImportSelector, BeanClassLoaderAware, ResourceLoaderAware, BeanFactoryAware, EnvironmentAware, Ordered 這些接口。核心代碼為

public class AutoConfigurationImportSelector implements DeferredImportSelector, BeanClassLoaderAware, ResourceLoaderAware, BeanFactoryAware, EnvironmentAware, Ordered {
    //...
    public String[] selectImports(AnnotationMetadata annotationMetadata) {
        if (!this.isEnabled(annotationMetadata)) {
            return NO_IMPORTS;
        } else {
            AutoConfigurationImportSelector.AutoConfigurationEntry autoConfigurationEntry = this.getAutoConfigurationEntry(annotationMetadata);
            return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
        }
    }
}

再來具體看getAutoConfigurationEntry 方法具體是如何判斷哪些是需要導(dǎo)入的。

protected AutoConfigurationImportSelector.AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {
        if (!this.isEnabled(annotationMetadata)) {
            return EMPTY_ENTRY;
        } else {
            AnnotationAttributes attributes = this.getAttributes(annotationMetadata);
            List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
            configurations = this.removeDuplicates(configurations);
            Set<String> exclusions = this.getExclusions(annotationMetadata, attributes);
            this.checkExcludedClasses(configurations, exclusions);
            configurations.removeAll(exclusions);
            configurations = this.getConfigurationClassFilter().filter(configurations);
            this.fireAutoConfigurationImportEvents(configurations, exclusions);
            return new AutoConfigurationImportSelector.AutoConfigurationEntry(configurations, exclusions);
        }
    }

??annotationMetadata 參數(shù)是一個(gè)元數(shù)據(jù)接口,它提供了對(duì)注解元數(shù)據(jù)的訪問權(quán)限,通常用于在運(yùn)行時(shí)檢查類上的注解。

??getAutoConfigurationEntry(annotationMetadata)方法會(huì)根據(jù)傳入的 annotationMetadata返回一個(gè) AutoConfigurationEntry 對(duì)象。

??AutoConfigurationEntry 是一個(gè)內(nèi)部類,用于封裝自動(dòng)配置項(xiàng)的信息,包括該自動(dòng)配置項(xiàng)的類名、條件(Conditions)等信息。

??通過獲取到的 autoConfigurationEntry 對(duì)象,Spring Boot 就能夠知道哪些自動(dòng)配置類需要被導(dǎo)入,從而將它們注冊(cè)到 Spring 上下文中。

1024程序員節(jié)特輯:【Spring Boot自動(dòng)配置原理揭秘】,# Spring Boot,spring boot,后端,java,自動(dòng)配置,源碼閱讀

  如果喜歡的話,歡迎 ??關(guān)注 ??點(diǎn)贊 ??評(píng)論 ??收藏  ??一起討論
  你的支持就是我??創(chuàng)作的動(dòng)力!					  ??????

到了這里,關(guān)于1024程序員節(jié)特輯:【Spring Boot自動(dòng)配置原理揭秘】的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 程序員幫助程序員!用1024拼出更美好的云計(jì)算未來

    程序員幫助程序員!用1024拼出更美好的云計(jì)算未來

    中國的云計(jì)算市場(chǎng)是全球增長最快的。據(jù)預(yù)測(cè),中國公共云服務(wù)市場(chǎng)的全球份額將從 2020 年的 6.5% 增加到 2024 年的 10.5% 以上。 伴隨行業(yè)的迅速發(fā)展,催生了云計(jì)算相關(guān)人才需求的井噴增長,供需矛盾凸顯。據(jù)德意志銀行分析報(bào)告,越來越多IT企業(yè)關(guān)閉了線下IDC,開始把業(yè)務(wù)遷

    2024年02月16日
    瀏覽(28)
  • 1024 程序員節(jié),圓一個(gè)小小的夢(mèng)

    Hope is a good thing, maybe the best of things, and no good thing ever dies. 希望是件美麗的東西,也許是最好的東西,而美好的東西是永遠(yuǎn)不會(huì)消逝的。 大家好,我是勇哥 。 1024 , 程序員節(jié),圓了我一個(gè)小小的夢(mèng)。 花了半年時(shí)間,我寫了一本電子書 ,書名是:《 RocketMQ4.X設(shè)計(jì)精要 》,我想

    2024年02月08日
    瀏覽(30)
  • 解決github ping不通的問題(1024程序員節(jié)快樂!

    1024程序員節(jié)快樂?。?隨便粘貼一個(gè)文檔,參加活動(dòng) 域名解析(域名-IP):https://www.ipaddress.com/ Ubuntu平臺(tái) github經(jīng)常ping不通或者訪問緩慢,方法是更改hosts文件 在hosts里添加github的ip 140.82.114.4 www.github.com 199.232.5.194 github.global.ssl.fastly.net 54.231.114.219 github-cloud.s3.amazonaws.com 可以訪

    2024年01月18日
    瀏覽(35)
  • 好用且免費(fèi)的CodeWhisperer,給1024程序員節(jié)送禮來了

    好用且免費(fèi)的CodeWhisperer,給1024程序員節(jié)送禮來了

    ? ? ? 國慶期間沒有膽量去人從眾的景點(diǎn),關(guān)在家里刷手機(jī)時(shí)意外在亞馬遜的User Group公眾號(hào)上發(fā)現(xiàn)了CodeWhisperer這么個(gè)好東西(bu yao qian),以后擼代碼也可以提高生產(chǎn)力(fang yang mo yu)了,這還不趕緊上手試一下??垂俜浇榻B說它支持流行的IDE開發(fā)工具,包括VS Code、Intelli

    2024年02月08日
    瀏覽(31)
  • 1024程序員節(jié)帶你玩轉(zhuǎn)圖片Exif信息獲取之JavaScript

    1024程序員節(jié)帶你玩轉(zhuǎn)圖片Exif信息獲取之JavaScript

    目錄 一、前言 二、背景 三、Exif.js ? ? ? ? ?1、Exif.js 簡介 2、Exif.js 引入 四、多場(chǎng)景展示數(shù)據(jù)獲取 1、原始圖片直接獲取 ?2、base64 編碼文件加載 ?3、文件上傳的方式加載 ?五、總結(jié) ? ? ? ?1024是2的十次方,二進(jìn)制計(jì)數(shù)的基本計(jì)量單位之一。1G=1024M,而1G與1級(jí)諧音,也有一

    2024年02月20日
    瀏覽(98)
  • 1024程序員狂歡節(jié) | IT前沿技術(shù)、人工智能、數(shù)據(jù)挖掘、網(wǎng)絡(luò)空間安全技術(shù)

    1024程序員狂歡節(jié) | IT前沿技術(shù)、人工智能、數(shù)據(jù)挖掘、網(wǎng)絡(luò)空間安全技術(shù)

    一年一度的1024程序員狂歡節(jié)又到啦!成為更卓越的自己,堅(jiān)持閱讀和學(xué)習(xí),別給自己留遺憾,行動(dòng)起來吧! 那么,都有哪些好書值得入手呢?小編為大家整理了前沿技術(shù)、人工智能、集成電路科學(xué)與芯片技術(shù)、新一代信息與通信技術(shù)、網(wǎng)絡(luò)空間安全技術(shù),四大熱點(diǎn)領(lǐng)域近期

    2024年02月06日
    瀏覽(32)
  • PHP框架開發(fā)實(shí)踐 | 1024 程序員節(jié):通過index.php找到對(duì)應(yīng)的controller是如何實(shí)現(xiàn)的

    PHP框架開發(fā)實(shí)踐 | 1024 程序員節(jié):通過index.php找到對(duì)應(yīng)的controller是如何實(shí)現(xiàn)的

    ??作者簡介,黑夜開發(fā)者,CSDN領(lǐng)軍人物,全棧領(lǐng)域優(yōu)質(zhì)創(chuàng)作者?,CSDN博客專家,阿里云社區(qū)專家博主,2023年6月CSDN上海賽道top4。 ??數(shù)年電商行業(yè)從業(yè)經(jīng)驗(yàn),歷任核心研發(fā)工程師,項(xiàng)目技術(shù)負(fù)責(zé)人。 ??本文已收錄于PHP專欄:PHP進(jìn)階實(shí)戰(zhàn)教程。 ??歡迎 ??點(diǎn)贊?評(píng)論?收藏

    2024年02月08日
    瀏覽(31)
  • 1024程序員狂歡節(jié)有好禮 | 前沿技術(shù)、人工智能、集成電路科學(xué)與芯片技術(shù)、新一代信息與通信技術(shù)、網(wǎng)絡(luò)空間安全技術(shù)

    1024程序員狂歡節(jié)有好禮 | 前沿技術(shù)、人工智能、集成電路科學(xué)與芯片技術(shù)、新一代信息與通信技術(shù)、網(wǎng)絡(luò)空間安全技術(shù)

    ??歡迎來到 愛書不愛輸?shù)某绦蛟?的博客, 本博客致力于知識(shí)分享,與更多的人進(jìn)行學(xué)習(xí)交流 ?????? 點(diǎn)擊直達(dá)福利 一年一度的1024程序員狂歡節(jié)又到啦!成為更卓越的自己,堅(jiān)持閱讀和學(xué)習(xí),別給自己留遺憾,行動(dòng)起來吧! 那么,都有哪些好書值得入手呢?小編為大家整理

    2024年02月08日
    瀏覽(23)
  • 1024程序節(jié)特輯:一文讀懂小程序支付流程

    1024程序節(jié)特輯:一文讀懂小程序支付流程

    主頁傳送門:?? 傳送 ??小程序支付是由微信支付推出的一種便捷支付方式,通過掃碼、公眾號(hào)跳轉(zhuǎn)或應(yīng)用內(nèi)支付完成付款。小程序支付適用于各類線上場(chǎng)景,為商家提供了高效的收款方式,也為消費(fèi)者提供了更加便捷的支付體驗(yàn)。 ??隨著移動(dòng)互聯(lián)網(wǎng)的發(fā)展,小程序支付

    2024年02月07日
    瀏覽(20)
  • Spring Data訪問Elasticsearch----查詢方法,程序員必學(xué)

    例子 Elasticsearch查詢字符串 And findByNameAndPrice { “query” : {“bool” : {“must” : [{ “query_string” : { “query” : “?”, “fields” : [ “name” ] } },{“query_string” : { “query” : “?”, “fields” : [ “price” ] } }]}}} Or findByNameOrPrice {“query”:{“bool”:{“should”:[{“query_string”

    2024年04月14日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包