成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

SpringBoot 中 @SpringBootApplication注解背后的三體結(jié)構(gòu)探秘

Tecode / 1966人閱讀

摘要:概述約定大于配置的功力讓我們?nèi)玢宕猴L(fēng),在我之前寫(xiě)的文章從到也對(duì)比過(guò)和這兩個(gè)框架,不過(guò)最終以超高的代碼信噪比和易上手性讓我們映像頗深。至于,我想在非時(shí)代大家應(yīng)該不陌生吧,作用是配置容器,也即形式的容器的配置類所使用。

概 述

SpringBoot 約定大于配置 的功力讓我們?nèi)玢宕猴L(fēng),在我之前寫(xiě)的文章《從SpringBoot到SpringMVC》
也對(duì)比過(guò) SpringBoot 和 SpringMVC 這兩個(gè)框架,不過(guò)最終 SpringBoot 以超高的代碼信噪比 和 易上手性 讓我們映像頗深。

但歸根結(jié)底,不論 SpringBoot 或者 SpringMVC 應(yīng)用本質(zhì)上依然是一個(gè)基于 Spring的應(yīng)用,只不過(guò)在后者臉龐上蒙上了一層神秘的面紗而已!

回到 SpringBoot 的話題,我們?cè)陂_(kāi)發(fā)基于 SpringBoot 的應(yīng)用時(shí),用到了一些新的注解和類,正式由于其存在,才讓JavaEE的開(kāi)發(fā)如魚(yú)得水。這其中我們用的最多的注解之一,當(dāng)屬 SpringBoot 應(yīng)用啟動(dòng)類上的 @SpringBootApplication 注解了

本文就來(lái)看看它到底是個(gè)啥!

注: 本文首發(fā)于 My 公眾號(hào) CodeSheep ,可 長(zhǎng)按掃描 下面的 小心心 來(lái)訂閱 ↓ ↓ ↓

@SpringBootApplication 背后到底是什么?

@SpringBootApplication注解實(shí)際上是SpringBoot提供的一個(gè)復(fù)合注解,我們來(lái)看一看其源碼:

@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 {
    ...
}

看得很清楚,其是一個(gè)合成體,但其中最重要的三個(gè)注解分別是:

@SpringBootConfiguration

@EnableAutoConfiguration

@ComponentScan

我們不妨稱其為 “ 三體結(jié)構(gòu) ” 吧!

如果我們不怕麻煩,在 SpringBoot 應(yīng)用的啟動(dòng)類上用這個(gè)三個(gè)注解代替@SpringBootApplication 注解發(fā)現(xiàn)也是沒(méi)問(wèn)題的:

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
public class TestSpringBootApplication {
    ...
}

下面分別剖析一下這三個(gè)注解的功效!

@SpringBootConfiguration

看代碼吧,代碼里是這樣寫(xiě)的:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {

}

這說(shuō)明 @SpringBootConfiguration 也是來(lái)源于 @Configuration,二者功能都是將當(dāng)前類標(biāo)注為配置類,并將當(dāng)前類里以 @Bean 注解標(biāo)記的方法的實(shí)例注入到srping容器中,實(shí)例名即為方法名。

至于@Configuration,我想在非SpringBoot時(shí)代大家應(yīng)該不陌生吧,作用是配置Spring容器,也即 JavaConfig 形式的 Spring IoC 容器的配置類所使用。

到目前來(lái)看,好像還沒(méi)有什么新東西?。?!

@EnableAutoConfiguration

再繼續(xù)看代碼,代碼是這樣的:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
    ...
}

@EnableAutoConfiguration 注解啟用自動(dòng)配置,其可以幫助 SpringBoot 應(yīng)用將所有符合條件的 @Configuration 配置都加載到當(dāng)前 IoC 容器之中,可以簡(jiǎn)要用圖形示意如下:

接下來(lái)我們對(duì)照源碼,來(lái)解釋一下這個(gè)流程:

@EnableAutoConfiguration 借助 AutoConfigurationImportSelector 的幫助,而后者通過(guò)實(shí)現(xiàn) selectImports() 方法來(lái)導(dǎo)出 Configuration

AutoConfigurationImportSelector 類的 selectImports() 方法里面通過(guò)調(diào)用Spring Core 包里 SpringFactoriesLoader 類的 loadFactoryNames()方法

最終通過(guò) SpringFactoriesLoader.loadFactoryNames() 讀取了 ClassPath 下面的 META-INF/spring.factories 文件來(lái)獲取所有導(dǎo)出類。

而spring.factories 文件里關(guān)于 EnableAutoConfiguration 的配置其實(shí)就是一個(gè)鍵值對(duì)結(jié)構(gòu),樣子大概長(zhǎng)下面這樣:

說(shuō)了這么多,如果從稍微宏觀一點(diǎn)的角度 概括總結(jié) 上述這一過(guò)程那就是:

從 ClassPath下掃描所有的 META-INF/spring.factories 配置文件,并將spring.factories 文件中的 EnableAutoConfiguration 對(duì)應(yīng)的配置項(xiàng)通過(guò)反射機(jī)制實(shí)例化為對(duì)應(yīng)標(biāo)注了 @Configuration 的形式的IoC容器配置類,然后注入IoC容器。

@ComponentScan

@ComponentScan 對(duì)應(yīng)于XML配置形式中的 ,用于將一些標(biāo)注了特定注解的bean定義批量采集注冊(cè)到Spring的IoC容器之中,這些特定的注解大致包括:

@Controller

@Entity

@Component

@Service

@Repository

等等

對(duì)于該注解,還可以通過(guò) basePackages 屬性來(lái)更細(xì)粒度的控制該注解的自動(dòng)掃描范圍,比如:

@ComponentScan(basePackages = {"cn.codesheep.controller","cn.codesheep.entity"})

可見(jiàn) 這個(gè)注解也并不是什么新東西!

后 記
由于能力有限,若有錯(cuò)誤或者不當(dāng)之處,還請(qǐng)大家批評(píng)指正,一起學(xué)習(xí)交流!

作者更多的原創(chuàng)文章在此,歡迎觀賞

My Personal Blog

作者更多的SpringBt實(shí)踐文章在此:

Spring Boot Admin2.0開(kāi)箱體驗(yàn)

Spring Boot應(yīng)用監(jiān)控實(shí)戰(zhàn)

SpringBoot應(yīng)用部署于外置Tomcat容器

ElasticSearch搜索引擎在SpringBt中的實(shí)踐

初探Kotlin+SpringBoot聯(lián)合編程

Spring Boot日志框架實(shí)踐

SpringBoot優(yōu)雅編碼之:Lombok加持

如果有興趣,也可以抽點(diǎn)時(shí)間看看作者一些關(guān)于容器化、微服務(wù)化方面的文章:

利用K8S技術(shù)棧打造個(gè)人私有云 連載文章

從一份配置清單詳解Nginx服務(wù)器配置

Docker容器可視化監(jiān)控中心搭建

利用ELK搭建Docker容器化應(yīng)用日志中心

RPC框架實(shí)踐之:Apache Thrift

RPC框架實(shí)踐之:Google gRPC

微服務(wù)調(diào)用鏈追蹤中心搭建

Docker容器跨主機(jī)通信

Docker Swarm集群初探

高效編寫(xiě)Dockerfile的幾條準(zhǔn)則

長(zhǎng)按掃描 下面的 小心心 來(lái)訂閱 CodeSheep,獲取更多 務(wù)實(shí)、能看懂、可復(fù)現(xiàn)的 原創(chuàng)文 ↓↓↓

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/76566.html

相關(guān)文章

  • 三.spring-boot:簡(jiǎn)述springboot啟動(dòng)流程

    摘要:如下頁(yè)面模版的配置啟動(dòng)簡(jiǎn)單流程當(dāng)我們運(yùn)行的方法時(shí)調(diào)用靜態(tài)方法首先是實(shí)例化初始化的時(shí)候主要做主要做三件事根據(jù)下是否存在判斷是否要啟動(dòng)一個(gè)。將配置環(huán)境加入到監(jiān)聽(tīng)器對(duì)象中。方法將等重要組件與上下文對(duì)象關(guān)聯(lián)。自此的簡(jiǎn)單流程到此結(jié)束。 正文 說(shuō)springboot的啟動(dòng)流程當(dāng)然少不了springboot啟動(dòng)入口類 @SpringBootApplication public class Sprin...

    masturbator 評(píng)論0 收藏0
  • 這樣講 SpringBoot 自動(dòng)配置原理,你應(yīng)該能明白了吧

    摘要:這里有一個(gè)參數(shù),主要是用來(lái)指定該配置項(xiàng)在配置文件中的前綴。創(chuàng)建一個(gè)配置類,里面沒(méi)有顯式聲明任何的,然后將剛才創(chuàng)建的導(dǎo)入。創(chuàng)建實(shí)現(xiàn)類,返回的全類名。創(chuàng)建實(shí)現(xiàn)類,實(shí)現(xiàn)方法直接手動(dòng)注冊(cè)一個(gè)名叫的到容器中。前言 小伙伴們是否想起曾經(jīng)被 SSM 整合支配的恐懼?相信很多小伙伴都是有過(guò)這樣的經(jīng)歷的,一大堆配置問(wèn)題,各種排除掃描,導(dǎo)入一個(gè)新的依賴又得添加新的配置。自從有了 SpringBoot 之后,咋...

    cc17 評(píng)論0 收藏0
  • 【Spring Boot】Spring Boot——HelloWorld

    摘要:使用嵌入式容器,應(yīng)用無(wú)需達(dá)成包。自動(dòng)依賴與版本控制。準(zhǔn)生產(chǎn)環(huán)境的運(yùn)行時(shí)應(yīng)用監(jiān)控。告訴開(kāi)啟自動(dòng)配置功能,這樣自動(dòng)配置才能生效。其組成為為的底層注解,表明給容器中導(dǎo)入一個(gè)組件,導(dǎo)入的組建由類提供。 Spring Boot——入門(mén) spring boot簡(jiǎn)化了spring的開(kāi)發(fā),是J2EE一站式解決方案。 Spring Boot 的優(yōu)缺點(diǎn) 優(yōu)點(diǎn) 快速創(chuàng)建獨(dú)立運(yùn)行的服務(wù),與主流框架集成。 使...

    hellowoody 評(píng)論0 收藏0
  • SpringBoot源碼分析系列(一)--核心注解

    摘要:用于主類上最最最核心的注解,表示這是一個(gè)項(xiàng)目,用于開(kāi)啟的各項(xiàng)能力。下面我們來(lái)分析一下這個(gè)注解的組成以及作用通過(guò)上面的代碼我們可以看出來(lái)是一個(gè)組合注解,主要由和這三個(gè)注解組成的。通過(guò)源碼可以看出也是一個(gè)組合注解。 ??SpringBoot項(xiàng)目一般都會(huì)有Application的入口類,入口類中會(huì)有main方法,這是一個(gè)標(biāo)準(zhǔn)的java應(yīng)用程序的入口方法。@SpringBootApplicat...

    seanlook 評(píng)論0 收藏0
  • SpringBoot究竟是如何跑起來(lái)的?

    摘要:你可以試著沿著調(diào)用棧代碼一層一層的深入進(jìn)去,如果你不打斷點(diǎn),你根本不知道接下來(lái)程序會(huì)往哪里流動(dòng)。接下來(lái)再看看運(yùn)行時(shí)堆棧,看看一個(gè)請(qǐng)求的調(diào)用棧有多深。就是如此被自動(dòng)裝配進(jìn)的。 摘要: 神奇的SpringBoot。 原文:SpringBoot 究竟是如何跑起來(lái)的? 作者:老錢(qián) Fundebug經(jīng)授權(quán)轉(zhuǎn)載,版權(quán)歸原作者所有。 不得不說(shuō) SpringBoot 太復(fù)雜了,我本來(lái)只想研究一下...

    DevWiki 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<