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

Spring?Boot?中starter的原理詳析

 更新時(shí)間:2022年06月06日 11:57:47   作者:??香菜_香菜????  
這篇文章主要介紹了Spring?Boot?中starter原理詳析,文章圍繞主題展開springboot的插件機(jī)制和starter原理相關(guān)資料,需要的小伙伴可以參考一下

前言:

今天介紹springboot ,也是寫下springboot的插件機(jī)制,starter的原理,其實(shí)這個(gè)網(wǎng)上已經(jīng)很多了,也是看了不少別人的文章,今天主要還是帶著問題去記錄下。

1、springboot 的starter 的啟動(dòng)原理是什么

原理

這個(gè)問題是很簡(jiǎn)單的,只要了解springboot的同學(xué)應(yīng)該都知道,也是必須了解的。

  • ① Spring Boot 在啟動(dòng)時(shí)會(huì)去classpath中中尋找 resources/META-INF/spring.factories 文件
  • ② 根據(jù) spring.factories 配置加載 AutoConfigure 類
  • ③ 根據(jù) @Conditional 注解的條件,進(jìn)行自動(dòng)配置并將 Bean 注入 Spring Context

來個(gè)例子

我們看個(gè)例子,下面是我工作中的一個(gè)starter,刪除了一些公司的代碼

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ 
com.xx.common.ratelimiter.config.reactive.WebsocketRateLimiterAutoConfiguration,\ 
com.xx.common.ratelimiter.config.ProductIdLimiterAutoConfiguration

解釋下:

  • EnableAutoConfiguration 這個(gè)是固定的,在springboot啟動(dòng)的時(shí)候,會(huì)去實(shí)例化這個(gè)key之后的每一個(gè)類
  • \ 是連接符,也就是表示這是一行數(shù)據(jù),只不過可以分行表示
  • WebsocketRateLimiterAutoConfiguration 后面這兩行是業(yè)務(wù)自定義的config類,多個(gè)的話都好分割
@Configuration
@ConditionalOnProperty(
        prefix = "gateway.ratelimiter",
        name = {"enabled"},
        havingValue = "true"
)
@EnableConfigurationProperties(RateLimiterProperties.class)
@AutoConfigureAfter({RedisAutoConfiguration.class})
public class ProductIdLimiterAutoConfiguration {
...
}

上面這個(gè)是配置類,可以看到這個(gè)最主要的是一些注解

  • @Configuration 標(biāo)識(shí)這是一個(gè)配置類
  • @ConditionalOnProperty 標(biāo)識(shí)這個(gè)類的實(shí)例化需要在配置文件中存在 gateway.ratelimiter.enable 這個(gè)key,并且值為true
  • @EnableConfigurationProperties 將配置中的類,讀取到RateLimiterProperties.class 這個(gè)對(duì)象中
  • @AutoConfigureAfter 這個(gè)顧名思義,需要在redis 的實(shí)例化之后,因?yàn)檫@個(gè)config依賴redis 。

小結(jié)

springboot starter的原理就是springboot項(xiàng)目在啟動(dòng)的時(shí)候掃描jar,然后讀取spring.factories 中EnableAutoConfiguration key 指向的config類

然后通過一系列的條件配置判斷,啟動(dòng)當(dāng)前stater

2、springboot 是如何找到配置類的

第一個(gè)問題解決了主要流程的問題,但是springboo是怎么找到spring.fatories的吶、?

這個(gè)主要是涉及jar包中資源的讀取,讓我們看下這個(gè)流程。

主要的路徑是下面這三個(gè)注解:

SpringBootApplication ->
    EnableAutoConfiguration -> 
      AutoConfigurationImportSelector org.springframework.boot.autoconfigure.AutoConfigurationImportSelector#selectImports 
      org.springframework.boot.autoconfigure.AutoConfigurationImportSelector#getAutoConfigurationEntry 
      org.springframework.boot.autoconfigure.AutoConfigurationImportSelector#getCandidateConfigurations 
      org.springframework.core.io.support.SpringFactoriesLoader#loadFactoryNames 
      org.springframework.core.io.support.SpringFactoriesLoader#loadSpringFactories Enumeration<URL> urls = classLoader.getResources(FACTORIES_RESOURCE_LOCATION); 
      public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";

通過上面的路徑,我們找到了最終是通過classloader 加載jar中"META-INF/spring.factories";當(dāng)然這段是代碼我們也可以用來加載其他的文件哦,也給我們借鑒,在下次需要實(shí)現(xiàn)類似的功能,可以直接抄。

3、springboot starter 的bean 是怎么加載到容器的

這個(gè)問題已經(jīng)很簡(jiǎn)單了,因?yàn)榈谝粋€(gè)問題已經(jīng)基本上可以看到原因了,

在springboot 加載到config的時(shí)候,可以在config中通過@bean進(jìn)行容器注冊(cè),這個(gè)bean就會(huì)加載到容器

這里主要要說幾個(gè)特殊的注解,@ConditionalOnXXX

  • @ConditionalOnBean:當(dāng)容器中有指定Bean的條件下進(jìn)行實(shí)例化。
  • @ConditionalOnMissingBean:當(dāng)容器里沒有指定Bean的條件下進(jìn)行實(shí)例化。
  • @ConditionalOnClass:當(dāng)classpath類路徑下有指定類的條件下進(jìn)行實(shí)例化。
  • @ConditionalOnMissingClass:當(dāng)類路徑下沒有指定類的條件下進(jìn)行實(shí)例化。
  • @ConditionalOnWebApplication:當(dāng)項(xiàng)目是一個(gè)Web項(xiàng)目時(shí)進(jìn)行實(shí)例化。
  • @ConditionalOnNotWebApplication:當(dāng)項(xiàng)目不是一個(gè)Web項(xiàng)目時(shí)進(jìn)行實(shí)例化。
  • @ConditionalOnProperty:當(dāng)指定的屬性有指定的值時(shí)進(jìn)行實(shí)例化。
  • @ConditionalOnExpression:基于SpEL表達(dá)式的條件判斷。
  • @ConditionalOnJava:當(dāng)JVM版本為指定的版本范圍時(shí)觸發(fā)實(shí)例化。
  • @ConditionalOnResource:當(dāng)類路徑下有指定的資源時(shí)觸發(fā)實(shí)例化。
  • @ConditionalOnJndi:在JNDI存在的條件下觸發(fā)實(shí)例化。
  • @ConditionalOnSingleCandidate:當(dāng)指定的Bean在容器中只有一個(gè),或者有多個(gè)但是指定了首選的Bean時(shí)觸發(fā)實(shí)例化。

如果想要定制自己的condition,可以實(shí)現(xiàn)Condition接口,定制Condition條件

4、總結(jié)

springboot starter 是springboot 的核心,提供了autoconfig,在開發(fā)中非常方便,也是必須需要了解的。 

到此這篇關(guān)于Spring Boot 中starter原理詳析的文章就介紹到這了,更多相關(guān)Spring Boot starter 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于java實(shí)現(xiàn)斗地主代碼實(shí)例解析

    基于java實(shí)現(xiàn)斗地主代碼實(shí)例解析

    這篇文章主要介紹了基于java實(shí)現(xiàn)斗地主代碼實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • SpringBoot多環(huán)境切換的配置實(shí)現(xiàn)

    SpringBoot多環(huán)境切換的配置實(shí)現(xiàn)

    在日常的開發(fā)中,一般都會(huì)分好幾種環(huán)境,本文就來介紹一下SpringBoot多環(huán)境切換的配置實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • Java中泛型總結(jié)(推薦)

    Java中泛型總結(jié)(推薦)

    這篇文章主要介紹了Java中泛型總結(jié),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • 使用Springboot 打jar包實(shí)現(xiàn)分離依賴lib和配置

    使用Springboot 打jar包實(shí)現(xiàn)分離依賴lib和配置

    這篇文章主要介紹了使用Springboot 打jar包實(shí)現(xiàn)分離依賴lib和配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • JAVA實(shí)現(xiàn)第三方短信發(fā)送過程詳解

    JAVA實(shí)現(xiàn)第三方短信發(fā)送過程詳解

    這篇文章主要介紹了JAVA實(shí)現(xiàn)第三方短信發(fā)送過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • SpringBoot下RabbitMq實(shí)現(xiàn)定時(shí)任務(wù)

    SpringBoot下RabbitMq實(shí)現(xiàn)定時(shí)任務(wù)

    這篇文章主要為大家詳細(xì)介紹了SpringBoot下RabbitMq實(shí)現(xiàn)定時(shí)任務(wù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • Java打亂ArrayList生成一個(gè)隨機(jī)序列列表

    Java打亂ArrayList生成一個(gè)隨機(jī)序列列表

    有時(shí)候會(huì)需要將一個(gè)ArrayList或者數(shù)組中的數(shù)字打亂,方便后續(xù)使用,比如隨機(jī)出題、答案選項(xiàng)打亂、連線題打亂、抽獎(jiǎng)號(hào)碼打亂等等,把我自己寫的一段代碼貼出來分享給大家。
    2016-08-08
  • java編程實(shí)現(xiàn)求解八枚銀幣代碼分享

    java編程實(shí)現(xiàn)求解八枚銀幣代碼分享

    這篇文章主要介紹了java編程實(shí)現(xiàn)求解八枚銀幣代碼分享,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • SpringBoot配置及使用Schedule過程解析

    SpringBoot配置及使用Schedule過程解析

    這篇文章主要介紹了SpringBoot配置及使用Schedule過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • Java實(shí)現(xiàn)簡(jiǎn)單聊天機(jī)器人

    Java實(shí)現(xiàn)簡(jiǎn)單聊天機(jī)器人

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡(jiǎn)單聊天機(jī)器人,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07

最新評(píng)論

昭觉县| 德化县| 平远县| 黄骅市| 仙游县| 邳州市| 德兴市| 南康市| 太仆寺旗| 吴川市| 鄱阳县| 左云县| 沧源| 彰化县| 武邑县| 自治县| 兴国县| 陵水| 玛多县| 东兰县| 郧西县| 姜堰市| 炎陵县| 莱西市| 临沧市| 康保县| 东源县| 海原县| 浙江省| 龙口市| 和政县| 深圳市| 抚顺县| 东至县| 荔浦县| 石泉县| 和田市| 本溪| 南安市| 鹰潭市| 长丰县|