自定義Spring Boot的Banner和Bean名稱是怎麼來的?

Spring Boot啟動過程的前三種狀態。自定義Spring Boot的Banner和Bean名稱是怎麼來的?

開始

今天,我們來聊聊Spring Boot應用在啟動到執行過程中的狀態變化的前三種狀態。

啟動中

我們按照SpringApplicationRunListener中規定的7個方法,來劃分Spring Boot應用在啟動過程中經歷的7種狀態。

啟動中,是Spring Boot應用在啟動過程中首先進入的一種狀態。在此之前,Spring Boot主要完成了以下一些事情:

1. SpringApplication例項構建。(收集初始化器和監聽器。判斷應用型別。)

2. 啟動秒錶,開始計時。

3. 設定無頭模式。

4. 收集SpringApplicationRunListener。

環境準備就緒

從啟動中到環境準備就緒,該階段應用主要完成應用執行環境的準備工作,主要就是根據應用型別及執行時引數,建立一個標準環境例項,並繫結到應用上。如SERVLET應用,則建立一個標準Servlet環境。

應用上下文準備就緒

從環境準備就緒到應用上下文準備就緒,應用做了以下一些事情:

1。 填充spring。beaninfo。ignore 配置,如為空,則填為true。

2。 列印banner。

3。 根據應用型別,建立應用上下文例項。如應用是一個SERVLET型別,則會建立一個org。springframework。boot。web。servlet。context。AnnotationConfigServletWebServerApplicationContext。

4。 獲取異常報告器列表。

5。 加工應用上下文。該步驟主要做三件事。第一是將Bean名稱生成器以單例模式註冊到Bean工廠中。第二是設定上下文的resourceLoader或classLoader。

第三是設定應用轉換器。

5. 初始化。

Banner

啥是Banner?請啟動你的應用,沒錯,就是下面這貨。

自定義Spring Boot的Banner和Bean名稱是怎麼來的?

Spring Boot預設Banner

這貨有什麼用?好看嗎?嗯,就是好看。這就是個彩蛋,當然,如果你搞成下面這樣,沒準兒可以提升程式設計師的開發效率。

自定義Spring Boot的Banner和Bean名稱是怎麼來的?

Spring Boot自定義Banner

怎麼搞的?很簡單,在resources下新建banner。txt檔案,檔案內容如下:

自定義Spring Boot的Banner和Bean名稱是怎麼來的?

你這妖孽,從何而來?速速現形。總有那麼一些古板的Leader不解風情。沒關係,在配置檔案中新增如下配置,即可關閉Banner。

自定義Spring Boot的Banner和Bean名稱是怎麼來的?

Bean名稱生成器

Bean需要一個名稱。那麼,這個名稱怎麼來的呢?於是就有了Bean名稱生成器。

spring-bean中,為Bean名稱生成器定義了一個介面,BeanNameGenerator,該介面包含一個方法generateBeanName,該方法接受兩個引數,分別是一個Bean定義和一個Bean定義註冊器,返回一個String,作為Bean的名稱。

Spring Boot採用AnnotationBeanNameGenerator作為預設的Bean名稱生成器。

AnnotationBeanNameGenerator位於spring-context中,實現了BeanNameGenerator介面,看名字就知道,這個Bean名稱生成器和註解相關。

觀察isStereotypeWithNameValue方法,我們得知,這個名稱生成器會去找Bean上面的一些相關注解,如Component,ManagedBean,Named等。需要了解的一點是,我們常用的一些,如Controller,Service,Repository等註解,都直接或間接的繼承了Component。

找到相關注解,取其value值,如果有,就以value值作為Bean名稱,如果沒有,則採用預設的Bean名稱生成方式,即透過類名轉換而來。轉換方式是,如果類名的前兩個字母都是大寫,則以類名作為Bean名稱,如果不是,則將首字線小寫後作為Bean名稱,即ABCTest的Bean名稱為ABCTest,而AbcTest的Bean名稱則為abcTest。

一般情況下,預設的Bean名稱是滿足我們的需要的,但是,也有例外的是,系統中出現了兩個同名的類(位於不同的包中),且這兩個類都要作為Bean交給Spring來管理。這個時候,如果不在註解中指定Bean名稱,Spring就會報錯。所以,要麼,我們就需要嚴格的框架級的類名命名規範,以保證不重名,要麼,就需要在註解中,透過value引數,自定義各不相同的Bean名稱。

相關

Spring Boot的優點,有哪些值得我們使用的地方

Spring Boot啟動流程之斷言和web應用型別

Spring中,ApplicationContext的繼承體系

自定義SpringApplication初始化器和監聽器

Spring Boot中,如何自定義Spring應用執行時監聽器