真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

如何理解SpringBoot核心運(yùn)行原理和運(yùn)作原理源碼

如何理解SpringBoot核心運(yùn)行原理和運(yùn)作原理源碼,針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。

創(chuàng)新互聯(lián)服務(wù)項(xiàng)目包括西峽網(wǎng)站建設(shè)、西峽網(wǎng)站制作、西峽網(wǎng)頁(yè)制作以及西峽網(wǎng)絡(luò)營(yíng)銷策劃等。多年來(lái),我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,西峽網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到西峽省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

SpringBoot核心運(yùn)行原理

Spring Boot 最核心的功能就是自動(dòng)配置,第 1 章中我們已經(jīng)提到,功能的實(shí)現(xiàn)都是基于“約定優(yōu)于配置”的原則。那么 Spring Boot  是如何約定,又是如何實(shí)現(xiàn)自動(dòng)配置功能的呢?

本章會(huì)帶領(lǐng)大家通過(guò)源碼學(xué)習(xí) Spring Boot 的核心運(yùn)作原理,內(nèi)容涉及自動(dòng)配置的運(yùn)作原理、核心功能模塊、核心注解以及使用到的核心源代碼分析。

核心運(yùn)行原理

使用 Spring Boot 時(shí),我們只需引|入對(duì)應(yīng)的 Starters, Spring Boot  啟動(dòng)時(shí)便會(huì)自動(dòng)加載相關(guān)依賴,配置相應(yīng)的初始化參數(shù),以最快捷、簡(jiǎn)單的形式對(duì)第三方軟件進(jìn)行集成,這便是 SpringBoot 的自動(dòng)配置功能。我們先從整體上看一下  Spring Boot 實(shí)現(xiàn)該運(yùn)作機(jī)制涉及的核心部分,如圖 2-1 所示。

如何理解SpringBoot核心運(yùn)行原理和運(yùn)作原理源碼

圖 2-1 描述了 Spring Boot  自動(dòng)配置功能運(yùn)作過(guò)程中涉及的幾個(gè)核心功能及其相互之間的關(guān)系包括@EnableAutoConfiguration、spring.factories、各組件對(duì)應(yīng)的  AutoConfiguration 類、@Conditional 注解以及各種 Starters。

可以用一句話來(lái)描述整個(gè)過(guò)程:Spring Boot 通過(guò)@EnableAutoConfiguration 注解開(kāi)啟自動(dòng)配置,加載  spring.factories 中注冊(cè)的各種 AutoConfiguration 類,當(dāng)某個(gè)  AutoConfiguration類滿足其注解@Conditional 指定的生效條件(Starters 提供的依賴、配置或 Spring 容器中是否存在某個(gè)  Bean 等)時(shí),實(shí)例化該 AutoConfiguration 類中定義的 Bean(組件等),并注入 Spring  容器,就可以完成依賴框架的自動(dòng)配置。

我們先從概念及功能上了解一下圖 2-1 所示部分的作用及相互關(guān)系,在后面章節(jié)中會(huì)針對(duì)每個(gè)功能及組件進(jìn)行源代碼級(jí)別的講解。

  • ·@EnableAutoConfiguration:該注解由組合注解@SpringBootApplication  引入,完成自動(dòng)配置開(kāi)啟,掃描各個(gè)jar包下的spring.factories文件,并加載文件中注冊(cè)的AutoConfiguration類等。

  • ·spring.factories:配置文件,位于 jar 包的 META-INF 目錄下,按照指定格式注冊(cè)了自動(dòng)配置的  AutoConfiguration 類。spring.factories 也可以包含其他類型待注冊(cè)的類。該配置文件不僅存在于 Spring Boot  項(xiàng)目中,也可以存在于自定義的自動(dòng)配置(或 Starter)項(xiàng)目中。

  • ·AutoConfiguration 類:自動(dòng)配置類,代表了 Spring Boot 中一類以  XXAutoConfiguration命名的自動(dòng)配置類。其中定義了三方組件集成 Spring 所需初始化的 Bean 和條件。

  • ·@Conditional:條件注解及其衍生注解,在 AutoConfiguration 類上使用,當(dāng)滿足該條件注解時(shí)才會(huì)實(shí)例化  AutoConfiguration 類。

  • ·Starters:三方組件的依賴及配置,Spring Boot 已經(jīng)預(yù)置的組件。Spring Boot 默認(rèn)的Starters 項(xiàng)目往往只包含了一個(gè)  pom 依賴的項(xiàng)目。如果是自定義的 starter,該項(xiàng)目還需包含 spring.factories 文件、AutoConfiguration  類和其他配置類。

以上在概念層面介紹了 Spring Boot 自動(dòng)配置的整體流程和基本運(yùn)作原理,下面將會(huì)詳細(xì)介紹這幾個(gè)核心部分的組成結(jié)構(gòu)及源代碼。

運(yùn)作原理源碼解析 Z@EnableAutoConfiguration

@EnableAutoConfiguration 是開(kāi)啟自動(dòng)配置的注解,在創(chuàng)建的 SpringBoot  項(xiàng)目中并不能直接看到此注解,它是由組合注解@SpringBootApplication 引入的。下面我們先來(lái)了解一下  入口類和@SpringBootApplication 注解的功能,然后再深入了解@EnableAutoConfiguration注解的構(gòu)成與作用。

入口類和@SpringBootApplication 注解

Spring Boot 項(xiàng)目創(chuàng)建完成會(huì)默認(rèn)生成-個(gè)*Application 的入口類。 在默認(rèn)情況下,無(wú)論是通過(guò) IDEA 還是通過(guò)官方創(chuàng)建基于  Maven 的 Spring Boo 項(xiàng)目,入口類的命名規(guī)則都是artifactld+Application。通過(guò)該類的 main 方法即可啟動(dòng) Spring  Boot 項(xiàng)目,代碼如下。

@SpringBootApplication public class SpringLearnApplication { public static void main(String[] args) { SpringApplication. run(DemoApplication. class, args); }}

這里的 main 方法并無(wú)特別之處,就是一一個(gè)標(biāo)準(zhǔn)的 Java 應(yīng)用的 main 方法,用于啟動(dòng) SpringBoot  項(xiàng)目的入口。在默認(rèn)情況下,按照上述規(guī)則命名并包含 main 方法的類稱為入口類。

在 Spring Boot 入口類(除單元測(cè)試外)中,唯一的一個(gè)注解就是@SpringBootApp-lication。

它是 Spring Boot 項(xiàng)目的核心注解,用于開(kāi)啟自動(dòng)配置,準(zhǔn)確說(shuō)是通過(guò)該注解內(nèi)組合的@EnableAutoConfiguration  開(kāi)啟了自動(dòng)配置。

@SpringBootApplication 部分源代碼如下。

@Target(ElementType . TYPE) @Retent ion(Retent ionPolicy . RUNTIME) @Documented @Inherited @SpringBootConfiguration @EnableAutoConfi guration @ComponentScan( excludeFilters = { @Filter(type = FilterType .CUSTOM, classes = TypeExcludeFilter. class), @Filter(type = FilterType. CUSTOM, classes = AutoConf igurationExcludeFilter . class) })public @interface SpringBootApplication { //排除指定自動(dòng)配置類 @AliasFor(annotation = EnableAutoConfiguration.class) Class[] exclude() default {}; //排除指定自動(dòng)配置類名 @AliasFor( annotation = EnableAutoConfiguration. class) String[] excludeName() default { //指定掃描的基礎(chǔ)包,激活炷解組件的初始化 @AliasFor( annotation = ComponentScan. class, attribute = "basePackages") String[] scanBasePackages() default {}; //指定掃描的類,用于初始化 @AliasFor( annotation = ComponentScan. class, attribute = "basePackageClass Class[] scanBasePackageClasses() default {}; //指定是否代理@Bean 方法以強(qiáng)制執(zhí)行 bean 的生命周期行為 @AliasFor( annotation = Configuration.class) boolean proxyBeanMethods() default true ; }

通過(guò)源代碼可以看出,該注解提供了以下成員屬性(注解中的成員變量以方法的形式體現(xiàn))。

  • exclude:根據(jù)類(Class) 排除指定的自動(dòng)配置,該成員屬性覆蓋了@SpringBoot-Application中組合的@  EnableAutoConfiguration 中定義的 exclude 成員屬性。

  • excludeName :根據(jù)類名排除指定的自動(dòng)配置,覆蓋了@ EnableAutoConfiguration 中的excludeName  的成員屬性。

  • :scanBasePackages:指定掃描的基礎(chǔ) package,用于激活@Component 等注解類的初始化。

  • scanBasePackageClasses:掃描指定的類,用于組件的初始化。

  • :proxyBeanMethods:指定是否代理@ Bean 方法以強(qiáng)制執(zhí)行 bean 的生命周期行為。此功能需要通過(guò)運(yùn)行時(shí)生成 CGLIB  子類來(lái)實(shí)現(xiàn)方法攔截。該子類有一定的限制,比如配置類及其方法不允許聲明為 final 等。

proxyBeanMethods 的默認(rèn)值為 true,允許配置類中進(jìn)行 inter-beanreferences (bean 之  間的引用)以及對(duì)該配置的@Bean 方法的外部調(diào)用。如果@Bean 方法都是自包含的,并且僅提供了容器使用的普通工程方法的功能,則可設(shè)置為 false,避免處理  CGLIB 子類。SpringBoot 2.2 版本上市后新增該成員屬性,后面章節(jié)涉及的自動(dòng)配置類中基本都會(huì)用到proxyBeanMethods,一  般情況下都配置為 false。

通過(guò)以上源代碼我們會(huì)發(fā)現(xiàn),Spring Boot 中大量使用了@AliasFor  注解,該注解用于橋接到其他注解,該注解的屬性中指定了所橋接的注解類。如果點(diǎn)進(jìn)去查看,會(huì)發(fā)現(xiàn)@SpringBootApplication 定  義的屬性在其他注解中已經(jīng)定義過(guò)了。之所以使用@AliasFor注解并重新在@SpringBootApplication  中定義,更多是為了減少用戶使用多注解帶來(lái)的麻煩。

@SpringBootApplication

注 解 中 組 合 了 @SpringBootConfiguration 、@EnableAutoConfiguration  和@ComponentScan。因此,在實(shí)踐過(guò)程中也可以使用這 3 個(gè)注解來(lái)替代@SpringBootApplication。

在 Spring Boot 早期版本中并沒(méi)有@SpringBootConfiguration  注解,版本升級(jí)后新增了@SpringBootConfiguration 并在其內(nèi)組合了@Configuration。

@EnableAutoConfiguration 注解組合了@AutoConfigurationPackage.我們忽略掉一些基礎(chǔ)注解和元注解,  @SpringBootApplication 注解的組合結(jié)構(gòu)可以參考圖2-2。

如何理解SpringBoot核心運(yùn)行原理和運(yùn)作原理源碼

在圖2-2中,@SpringBootApplication除 了組合元注解之外,其核心作用還包括:激活SpringBoot 自 動(dòng) 配 置 的  @EnableAutoConfiguration 、 激 活 @Component 掃 描  的@ComponentScan、激活配置類的@Configuration。

其中@ComponentScan 注解和@Configuration 注解在日常使用 Spring 時(shí)經(jīng)常用到,也非常 基 礎(chǔ) , 大 家應(yīng)該都有一些了  解 , 這 里 就 不 再 贅 述 了 。 下 面 詳 細(xì) 介 紹@EnableAuto-Configuration 的功能。

如何理解SpringBoot核心運(yùn)行原理和運(yùn)作原理源碼

注解@EnableAutoConfiguration功能解析

在未使用 Spring Boot 的情況下,Bean 的生命周期由 Spring 來(lái)管理,然而 Spring 無(wú)法自動(dòng)配置@Configuration  注解的類。而 Spring Boot 的核心功能之-  就是根據(jù)約定自動(dòng)管理該注解標(biāo)注的類。用來(lái)實(shí)現(xiàn)該功能的組件之-便是@EnableAutoConfiguration 注解。

@EnableAutoConfiguration 位 于 spring-boot autoconfigure 包 內(nèi) , 當(dāng) 使  用@SpringBootApplication 注解時(shí),@EnableAutoConfiguration 注 解會(huì)自動(dòng)生效。

@EnableAutoConfiguration 的主要功能是啟動(dòng) Spring 應(yīng)用程序上下文時(shí)進(jìn)行自動(dòng)配置,它會(huì)嘗試猜測(cè)并配置項(xiàng)目可能需要的  Bean。自動(dòng)配置通常是基于項(xiàng)目 classpath 中引入的類和已定義的 Bean 來(lái)實(shí)現(xiàn)的。在此過(guò)程中,被自動(dòng)配置的組件來(lái)自項(xiàng)目自身和項(xiàng)目依賴的  jar包中。

舉 個(gè) 例 子 : 如 果 將 tomcat-embedded.jar 添 加 到 classpath 下 , 那  么@EnableAutoConfiguration 會(huì)認(rèn)為你準(zhǔn)備用 TomcatServletWebServerFactory  類,并幫你初始化相關(guān)配置。與此同時(shí),如果自定義了基于 ServletWebServerFactory 的 Bean  ,那么@EnableAutoConfiguration 將不會(huì)進(jìn)行 TomcatServletWebServerFactory  類的初始化。這一系列的操作判斷都由 Spring Boot 來(lái)完成。

下面我們來(lái)看一下@EnableAutoConfiguration 注解的源碼。

@Target(ElementType . TYPE) @Retention( RetentionPolicy . RUNTIME) @Documented @Inherited @AutoConfigurationPackage @Import(AutoConf igurat ionImportSelector. class) public @interface EnableAutoConfiguration { //用來(lái)餐蓋配置開(kāi)啟/關(guān)閉自動(dòng)配置的功能 String ENABLED. OVERRIDE_ PROPERTY = "spring. boot . enableautoconf iguration" ; //根據(jù)類(Class) 排除指定的自動(dòng)配置 Class[] exclude() default {}; //根據(jù)類名排除指定的自動(dòng)配置 String[] excludeName() default {}; }

@EnableAutoConfiguration 注解提供了一-個(gè)常量和兩個(gè)成員參數(shù)的定義。

ENABLED OVERRIDE PROPERTY:用來(lái)覆蓋開(kāi)啟/關(guān)閉自動(dòng)配置的功能。

  • -exclude:根據(jù)類(Class) 排除指定的自動(dòng)配置。

  • excludeName:根據(jù)類名排除指定的自動(dòng)配置。

正如上文所說(shuō),@EnableAutoConfiguration 會(huì)猜 測(cè)你需要使用的 Bean,但如果在實(shí)戰(zhàn)中你并不需要它預(yù)置初始化的  Bean,可通過(guò)該注解的 exclude 或 excludeName  參數(shù)進(jìn)行有針對(duì)性的排除。比如,當(dāng)不需要數(shù)據(jù)庫(kù)的自動(dòng)配置時(shí),可通過(guò)以下兩種方式讓其自動(dòng)配置失效。

//通過(guò)@SpringBootAppl ication 排除 DataSourceAutoConfiguration @SpringBootApplication(exclude = DataSourceAutoConfiguration.class)public class SpringLearnApplication {}或://通過(guò)@Enabl eAutoConfiguration 排除 DataSourceAutoConfiguration @Configuration@EnableAutoConfiguration( exclude = DataSourceAutoConfiguration. class)public class DemoConfiguration {}

需要注意的是,被@EnableAutoConfiguration 注 解的類所在 package 還具有特定的意義,通常會(huì)被作為掃描注解@Entity  的根路徑。這也是在使用@SpringBootApplication 注解時(shí)需要將被注解的類放在頂級(jí) package 下的原因,如果放在較低層級(jí),它所在  package 的同級(jí)或上級(jí)中的類就無(wú)法被掃描到。

而 對(duì) 于 入 口 類 和 其 main 方 法 來(lái) 說(shuō) , 并 不 依 賴 @SpringBootApplication 注 解  或@EnableAuto-Configuration 注解,也就是說(shuō)該注解可以使用在其他類上,而非入口類上。

關(guān)于如何理解SpringBoot核心運(yùn)行原理和運(yùn)作原理源碼問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。


當(dāng)前標(biāo)題:如何理解SpringBoot核心運(yùn)行原理和運(yùn)作原理源碼
URL地址:http://weahome.cn/article/gcdpej.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部