摘要:概述約定大于配置的功力讓我們?nèi)玢宕猴L(fēng),在我之前寫的文章從到也對比過和這兩個框架,不過最終以超高的代碼信噪比和易上手性讓我們映像頗深。至于,我想在非時代大家應(yīng)該不陌生吧,作用是配置容器,也即形式的容器的配置類所使用。
概 述
SpringBoot 約定大于配置 的功力讓我們?nèi)玢宕猴L(fēng),在我之前寫的文章《從SpringBoot到SpringMVC》
也對比過 SpringBoot 和 SpringMVC 這兩個框架,不過最終 SpringBoot 以超高的代碼信噪比 和 易上手性 讓我們映像頗深。
但歸根結(jié)底,不論 SpringBoot 或者 SpringMVC 應(yīng)用本質(zhì)上依然是一個基于 Spring的應(yīng)用,只不過在后者臉龐上蒙上了一層神秘的面紗而已!
回到 SpringBoot 的話題,我們在開發(fā)基于 SpringBoot 的應(yīng)用時,用到了一些新的注解和類,正式由于其存在,才讓JavaEE的開發(fā)如魚得水。這其中我們用的最多的注解之一,當(dāng)屬 SpringBoot 應(yīng)用啟動類上的 @SpringBootApplication 注解了
本文就來看看它到底是個啥!
注: 本文首發(fā)于 My 公眾號 CodeSheep ,可 長按 或 掃描 下面的 小心心 來訂閱 ↓ ↓ ↓@SpringBootApplication 背后到底是什么?
@SpringBootApplication注解實際上是SpringBoot提供的一個復(fù)合注解,我們來看一看其源碼:
@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 { ... }
看得很清楚,其是一個合成體,但其中最重要的三個注解分別是:
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
我們不妨稱其為 “ 三體結(jié)構(gòu) ” 吧!
如果我們不怕麻煩,在 SpringBoot 應(yīng)用的啟動類上用這個三個注解代替@SpringBootApplication 注解發(fā)現(xiàn)也是沒問題的:
@SpringBootConfiguration @EnableAutoConfiguration @ComponentScan public class TestSpringBootApplication { ... }
下面分別剖析一下這三個注解的功效!
@SpringBootConfiguration看代碼吧,代碼里是這樣寫的:
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Configuration public @interface SpringBootConfiguration { }
這說明 @SpringBootConfiguration 也是來源于 @Configuration,二者功能都是將當(dāng)前類標(biāo)注為配置類,并將當(dāng)前類里以 @Bean 注解標(biāo)記的方法的實例注入到srping容器中,實例名即為方法名。
至于@Configuration,我想在非SpringBoot時代大家應(yīng)該不陌生吧,作用是配置Spring容器,也即 JavaConfig 形式的 Spring IoC 容器的配置類所使用。
到目前來看,好像還沒有什么新東西!!!
@EnableAutoConfiguration再繼續(xù)看代碼,代碼是這樣的:
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @AutoConfigurationPackage @Import(AutoConfigurationImportSelector.class) public @interface EnableAutoConfiguration { ... }
@EnableAutoConfiguration 注解啟用自動配置,其可以幫助 SpringBoot 應(yīng)用將所有符合條件的 @Configuration 配置都加載到當(dāng)前 IoC 容器之中,可以簡要用圖形示意如下:
接下來我們對照源碼,來解釋一下這個流程:
@EnableAutoConfiguration 借助 AutoConfigurationImportSelector 的幫助,而后者通過實現(xiàn) selectImports() 方法來導(dǎo)出 Configuration
AutoConfigurationImportSelector 類的 selectImports() 方法里面通過調(diào)用Spring Core 包里 SpringFactoriesLoader 類的 loadFactoryNames()方法
最終通過 SpringFactoriesLoader.loadFactoryNames() 讀取了 ClassPath 下面的 META-INF/spring.factories 文件來獲取所有導(dǎo)出類。
而spring.factories 文件里關(guān)于 EnableAutoConfiguration 的配置其實就是一個鍵值對結(jié)構(gòu),樣子大概長下面這樣:
說了這么多,如果從稍微宏觀一點的角度 概括總結(jié) 上述這一過程那就是:
從 ClassPath下掃描所有的 META-INF/spring.factories 配置文件,并將spring.factories 文件中的 EnableAutoConfiguration 對應(yīng)的配置項通過反射機制實例化為對應(yīng)標(biāo)注了 @Configuration 的形式的IoC容器配置類,然后注入IoC容器。
@ComponentScan@ComponentScan 對應(yīng)于XML配置形式中的
@Controller
@Entity
@Component
@Service
@Repository
等等
對于該注解,還可以通過 basePackages 屬性來更細(xì)粒度的控制該注解的自動掃描范圍,比如:
@ComponentScan(basePackages = {"cn.codesheep.controller","cn.codesheep.entity"})
可見 這個注解也并不是什么新東西!
后 記由于能力有限,若有錯誤或者不當(dāng)之處,還請大家批評指正,一起學(xué)習(xí)交流!
作者更多的原創(chuàng)文章在此,歡迎觀賞
My Personal Blog
作者更多的SpringBt實踐文章在此:
Spring Boot Admin2.0開箱體驗
Spring Boot應(yīng)用監(jiān)控實戰(zhàn)
SpringBoot應(yīng)用部署于外置Tomcat容器
ElasticSearch搜索引擎在SpringBt中的實踐
初探Kotlin+SpringBoot聯(lián)合編程
Spring Boot日志框架實踐
SpringBoot優(yōu)雅編碼之:Lombok加持
如果有興趣,也可以抽點時間看看作者一些關(guān)于容器化、微服務(wù)化方面的文章:
利用K8S技術(shù)棧打造個人私有云 連載文章
從一份配置清單詳解Nginx服務(wù)器配置
Docker容器可視化監(jiān)控中心搭建
利用ELK搭建Docker容器化應(yīng)用日志中心
RPC框架實踐之:Apache Thrift
RPC框架實踐之:Google gRPC
微服務(wù)調(diào)用鏈追蹤中心搭建
Docker容器跨主機通信
Docker Swarm集群初探
高效編寫Dockerfile的幾條準(zhǔn)則
可 長按 或 掃描 下面的 小心心 來訂閱 CodeSheep,獲取更多 務(wù)實、能看懂、可復(fù)現(xiàn)的 原創(chuàng)文 ↓↓↓
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/76566.html
摘要:如下頁面模版的配置啟動簡單流程當(dāng)我們運行的方法時調(diào)用靜態(tài)方法首先是實例化初始化的時候主要做主要做三件事根據(jù)下是否存在判斷是否要啟動一個。將配置環(huán)境加入到監(jiān)聽器對象中。方法將等重要組件與上下文對象關(guān)聯(lián)。自此的簡單流程到此結(jié)束。 正文 說springboot的啟動流程當(dāng)然少不了springboot啟動入口類 @SpringBootApplication public class Sprin...
摘要:這里有一個參數(shù),主要是用來指定該配置項在配置文件中的前綴。創(chuàng)建一個配置類,里面沒有顯式聲明任何的,然后將剛才創(chuàng)建的導(dǎo)入。創(chuàng)建實現(xiàn)類,返回的全類名。創(chuàng)建實現(xiàn)類,實現(xiàn)方法直接手動注冊一個名叫的到容器中。前言 小伙伴們是否想起曾經(jīng)被 SSM 整合支配的恐懼?相信很多小伙伴都是有過這樣的經(jīng)歷的,一大堆配置問題,各種排除掃描,導(dǎo)入一個新的依賴又得添加新的配置。自從有了 SpringBoot 之后,咋...
摘要:使用嵌入式容器,應(yīng)用無需達(dá)成包。自動依賴與版本控制。準(zhǔn)生產(chǎn)環(huán)境的運行時應(yīng)用監(jiān)控。告訴開啟自動配置功能,這樣自動配置才能生效。其組成為為的底層注解,表明給容器中導(dǎo)入一個組件,導(dǎo)入的組建由類提供。 Spring Boot——入門 spring boot簡化了spring的開發(fā),是J2EE一站式解決方案。 Spring Boot 的優(yōu)缺點 優(yōu)點 快速創(chuàng)建獨立運行的服務(wù),與主流框架集成。 使...
摘要:用于主類上最最最核心的注解,表示這是一個項目,用于開啟的各項能力。下面我們來分析一下這個注解的組成以及作用通過上面的代碼我們可以看出來是一個組合注解,主要由和這三個注解組成的。通過源碼可以看出也是一個組合注解。 ??SpringBoot項目一般都會有Application的入口類,入口類中會有main方法,這是一個標(biāo)準(zhǔn)的java應(yīng)用程序的入口方法。@SpringBootApplicat...
摘要:你可以試著沿著調(diào)用棧代碼一層一層的深入進(jìn)去,如果你不打斷點,你根本不知道接下來程序會往哪里流動。接下來再看看運行時堆棧,看看一個請求的調(diào)用棧有多深。就是如此被自動裝配進(jìn)的。 摘要: 神奇的SpringBoot。 原文:SpringBoot 究竟是如何跑起來的? 作者:老錢 Fundebug經(jīng)授權(quán)轉(zhuǎn)載,版權(quán)歸原作者所有。 不得不說 SpringBoot 太復(fù)雜了,我本來只想研究一下...
閱讀 3514·2023-04-25 20:09
閱讀 3720·2022-06-28 19:00
閱讀 3035·2022-06-28 19:00
閱讀 3058·2022-06-28 19:00
閱讀 3132·2022-06-28 19:00
閱讀 2860·2022-06-28 19:00
閱讀 3014·2022-06-28 19:00
閱讀 2610·2022-06-28 19:00