如何編寫Spring Boot自動配置

2021-08-02 20:09:23 字數 3669 閱讀 7305

spring-boot的乙個重要特性就是提供了各種各樣的autoconfiguration。例如datasourceautoconfiguration。這樣我們只需要在配置檔案中進行如下配置

spring:

datasource:

url: jdbc:mysql://*********xx/realname

username: ***xx

password: ***xx

driverclassname: com

.mysql

.jdbc

.driver

spring-boot就會在容器中按照我們的配置的資訊注入乙個datasource。那麼spring boot是怎麼知道 datasourceautoconfiguration是自動配置類?其實很簡單:

1. spring boot 在啟動時候會讀取檔案classpath:\meta-inf\spring.factories的所有檔案,spring.factories其實是乙個properties的檔案,即是 key = value的形式。

2. 獲取spring.factories中key=org.springframework.boot.autoconfigure.enableautoconfiguration配置項的值(類的全路徑)作為spring啟動配置類

spring boot 這種用「約定優於配置」思想可以大大的簡化配置**的編寫。那麼,我們就可以按照上面的套路來編寫乙個spring-boot的自動配置類吧

現在有乙個配置bean——printafterinitbean,需要spring容器啟動以後,列印一次訊息,並且該訊息的內容是在配置檔案中定義

**如下,因為只是乙個簡單例子,這裡的配置bean其實可以是其他任何複雜配置bean,例如datasource。往往乙個公共包需要多個這樣配置bean才能完成其配置。

public

class

printafterinitbean

implements

initializingbean

//setter getter

}

如果搜尋spring boot下面的類,你會發現其實有很多名字形如***autoconfiguration的類,這些類都是spirng boot為我們做的一些快捷配置類。

建立乙個testautoconfig,作為乙個自動配置類

@configuration

public

class

testautoconfig

}

在resources下面建立meta-inf/spring.factories, 然後在檔案中把第二步的類配置進去

org.springframework

.boot

.autoconfigure

.enableautoconfiguration=com

.netease

.***

.***

.urspropertyautoconfig

這樣就完成乙個spring boot自動配置,如果存在init.message的配置,那麼spring boot啟動的時候就會列印init.message配置對應值。

spring boot的自動配置為我們在編寫乙個重複的配置**(或者xml檔案)中提供一套簡便的部署方式,這樣當用其他spring boot的專案依賴我們jar時候,配置起來就十分方便拉。從**可以看出,spring boot 其實並沒有什麼實質性的創新,只是把一些「約定」的配置資訊轉換原來通過**或xml實現的配置。

前面已經介紹過,@conditionalon*** 系列主要是自動配置是否生效,例如conditionalonclass,就是在某個class存在的情況下才生效。這一系列的註解通過名字就知道用法,因此不再做過多的介紹。@conditionalon*** 可以用於類名和方法名上。

- 用於類名上,要和 @configuration一起使用,決定該配置類是否生效

- 用於方法名上(注:前提是該方法也是乙個配置類,即有@configuration註解),結合@bean一起使用,判斷該@bean是否生成

用datasourceautoconfiguration **來說明,

@configuration

// 注:當存在datasource.class 和 embeddeddatabasetype.class 存在的情況下,該配置路徑才生效

@conditionalonclass()

@enableconfigurationproperties(datasourceproperties.class)

@import()

public

class datasourceautoconfiguration

...}

自動配置的核心思想就是不侵占使用者的**,類似於「你有就用你的,你沒有我就幫你做預設設定」。因此,我們在自己開發乙個自動配置類的時候也需要注意這一點,不然就有點霸王條款的感覺

一般我們的自動配置類都會依賴外部的配置資訊,而這些外部的配置資訊可以封裝成乙個類,類似上面datasourceautoconfiguration中的@enableconfigurationproperties(datasourceproperties.class),datasourceproperties類就是用來儲存datasource相關的配置資訊。「約定優於配置」的思想就在這裡體現,如果配置資訊是以spring.datasource為字首,那麼配置資訊都會注入到datasourceproperties類中,供datasourceautoconfiguration使用。

@configurationproperties(prefix = "spring.datasource")

public

class

datasourceproperties

implements

beanclassloaderaware, environmentaware, initializingbean {

...private

class

extends

datasource> type;

private

string

driverclassname;

private

string

url;

private

string

username;

private

string

password;

...

在一些特殊的情況下,一些自動配置類需要在某一些其他配置類後進行,例如依賴另外乙個自動配置的bean,這個時候就@autoconfigureafter來進行約束。

spring boot 核心思想就是「約定優於配置」思想,在建立乙個微服務的時候有很多得天獨厚的優勢,往往只用短短幾行配置,就可以部署乙個應用。這樣在編碼更多的是一些業務層面。而如果我們自己編寫的乙個公共包也能夠通過短短幾行配置即可以完成,不僅僅是**層面的減少,更是接入方來說是一種「一站式服務」體驗。當然前提是接入方也是使用的spring boot。

SpringBoot(二)編寫HTML頁面

使用thymeleaf編寫乙個html頁面 訪問靜態資源 如何傳遞引數給html頁面 模擬登入驗證過程 上一節已經說過如何構建乙個springboot專案,springboot 一 hello world 由於本文採用了thymeleaf模板引擎,因此需要新增thymeleaf依賴,pom.xml如...

spring boot編寫控制器

前面加入了spring boot starter web模組,預設整合了spring mvc。因此編寫乙個controller。即可實現乙個簡單的hello world程式。如下 controller public class mycontroller 在 中,使用了 該註解具有 component...

Spring Boot 編寫入門程式

2.1 pom.xml 配置 org.springframework.boot spring boot starter parent 1.5.9.release org.springframework.boot spring boot starter web 2.2 編寫主程式,用於啟動spring...