溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Spring Boot2中怎么自定義starter

發(fā)布時(shí)間:2021-12-27 17:13:18 來(lái)源:億速云 閱讀:116 作者:iii 欄目:大數(shù)據(jù)

本篇內(nèi)容介紹了“Spring Boot2中怎么自定義starter”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

WebSockets

Spring Boot為內(nèi)嵌的Tomcat(8和7),Jetty 9和Undertow提供WebSockets自動(dòng)配置。如果你正在將war包部署到獨(dú)立容器中,Spring Boot將假設(shè)該容器會(huì)負(fù)責(zé)配置WebSocket。Spring框架提供豐富的WebSocket支持,只需要添加spring-boot-starter-websocket模塊即可。

Web Services

Spring Boot提供Web Services自動(dòng)配置,你需要的就是定義Endpoints。通過(guò)添加spring-boot-starter-webservices模塊可以獲取Spring Web Services特性。

創(chuàng)建自己的auto-configuration

如果你在公司里開發(fā)共享libraries,或者正在開發(fā)一個(gè)開源或商業(yè)library,你可能想開發(fā)自己的自動(dòng)配置(auto-configuration)。自動(dòng)配置類可以打包到外部jars,并且依舊可以被Spring Boot識(shí)別。自動(dòng)配置可以關(guān)聯(lián)一個(gè)”starter”,用于提供auto-configuration的代碼及需要引用的libraries。我們首先講解構(gòu)建自己的auto-configuration需要知道哪些內(nèi)容,。

注意

可參考demo工程了解如何一步步創(chuàng)建一個(gè)starter。

理解自動(dòng)配置的beans

從底層來(lái)講,自動(dòng)配置(auto-configuration)是通過(guò)標(biāo)準(zhǔn)的@Configuration類實(shí)現(xiàn)的。此外,@Conditional注解用來(lái)約束自動(dòng)配置生效的條件。通常自動(dòng)配置類需要使用@ConditionalOnClass和@ConditionalOnMissingBean注解,這是為了確保只有在相關(guān)的類被發(fā)現(xiàn)及沒(méi)有聲明自定義的@Configuration時(shí)才應(yīng)用自動(dòng)配置,具體查看spring-boot-autoconfigure源碼中的@Configuration類(META-INF/spring.factories文件)。

定位自動(dòng)配置候選者

Spring Boot會(huì)檢查你發(fā)布的jar中是否存在META-INF/spring.factories文件,該文件中以EnableAutoConfiguration為key的屬性應(yīng)該列出你的配置類:

11 org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
22 com.mycorp.libx.autoconfigure.LibXAutoConfiguration,\
33 com.mycorp.libx.autoconfigure.LibXWebAutoConfiguration

你可以使用@AutoConfigureAfter或@AutoConfigureBefore注解為配置類指定特定的順序。例如,如果你提供web-specific配置,你的類就需要應(yīng)用在WebMvcAutoConfiguration后面。

你也可以使用@AutoconfigureOrder注解為那些相互不知道存在的自動(dòng)配置類提供排序,該注解語(yǔ)義跟常規(guī)的@Order注解相同,但專為自動(dòng)配置類提供順序。

注意

自動(dòng)配置類只能通過(guò)這種方式加載,確保它們定義在一個(gè)特殊的package中,特別是不能成為組件掃描的目標(biāo)。

條件注解

你幾乎總是需要在自己的自動(dòng)配置類里添加一個(gè)或更多的@Conditional注解。@ConditionalOnMissingBean注解是一個(gè)常見的示例,開發(fā)者可以用它覆蓋自動(dòng)配置類提供的默認(rèn)行為。

Spring Boot包含很多@Conditional注解,你可以在自己的代碼中通過(guò)注解@Configuration類或單獨(dú)的@Bean方法來(lái)重用它們。

Class條件

@ConditionalOnClass和@ConditionalOnMissingClass注解可以根據(jù)特定類是否出現(xiàn)來(lái)決定配置的包含,由于注解元數(shù)據(jù)是使用ASM來(lái)解析的,所以你可以使用value屬性來(lái)引用真正的類,即使該類沒(méi)有出現(xiàn)在運(yùn)行應(yīng)用的classpath下,也可以使用name屬性如果你傾向于使用字符串作為類名。

Bean條件

@ConditionalOnBean和@ConditionalOnMissingBean注解可以根據(jù)特定類是否存在決定bean的包含,你可以使用value屬性指定beans(by type),也可以使用name定義beans(by name),search屬性用于限制搜索beans時(shí)需要考慮的ApplicationContext層次。

注意

你需要注意bean定義添加的順序,因?yàn)檫@些條件的計(jì)算是基于目前處理內(nèi)容的。出于這個(gè)原因,我們推薦在自動(dòng)配置類上只使用@ConditionalOnBean和@ConditionalOnMissingBean注解(即使保證它們?cè)谄渌脩舳x的beans后加載)。

注意

@ConditionalOnBean和@ConditionalOnMissingBean不會(huì)阻止@Configuration類的創(chuàng)建,在類級(jí)別使用那些conditions跟使用注解標(biāo)記每個(gè)@Bean方法是等價(jià)的。

Property條件

@ConditionalOnProperty注解可以根據(jù)一個(gè)Spring Environment屬性來(lái)決定是否包含配置,使用prefix和name屬性指定要檢查的配置。默認(rèn)情況下,任何存在的只要不是false的屬性都會(huì)匹配,你也可以使用havingValue和matchIfMissing屬性創(chuàng)建更高級(jí)的檢測(cè)。

Resource條件

@ConditionalOnResource注解只在特定資源出現(xiàn)時(shí)才會(huì)包含配置,可以使用常見的Spring約定命名資源,例如file:/home/user/test.dat。

Web Application條件

@ConditionalOnWebApplication和@ConditionalOnNotWebApplication注解可以根據(jù)應(yīng)用是否為’web應(yīng)用’來(lái)決定是否包含配置,web應(yīng)用是任何使用Spring WebApplicationContext,定義一個(gè)session作用域,或有一個(gè)StandardServletEnvironment的應(yīng)用。

SpEL表達(dá)式條件

@ConditionalOnExpression注解可以根據(jù)SpEL表達(dá)式結(jié)果來(lái)決定是否包含配置。

創(chuàng)建自己的starter

一個(gè)完整的Spring Boot starter可能包含以下組件:

  • autoconfigure模塊,包含自動(dòng)配置類的代碼。

  • starter模塊,提供自動(dòng)配置模塊及其他有用的依賴,簡(jiǎn)而言之,添加本starter就能開始使用該library。

注意

如果不需要將它們分離開來(lái),你可以將自動(dòng)配置代碼和依賴管理放到一個(gè)單一模塊中。

命名

確保為你的starter提供一個(gè)合適的命名空間(namespace),模塊名不要以spring-boot作為開頭,盡管使用一個(gè)不同的Maven groupId,未來(lái)我們可能會(huì)為你正在做的自動(dòng)配置提供官方支持。

這里是經(jīng)驗(yàn)之談,假設(shè)你正在為“acme”創(chuàng)建一個(gè)starter,命名自動(dòng)配置模塊為acme-spring-boot-autoconfigure,命名starter為acme-spring-boot-starter,如果只有一個(gè)模塊結(jié)合它們,通常會(huì)使用acme-spring-boot-starter。

此外,如果你的starter提供配置keys,需要為它們提供一個(gè)合適的命名空間,特別是不要使用Spring Boot的命名空間(比如,server,management,spring等),這些是屬于Spring Boot的,我們可能會(huì)在將來(lái)以相同方式提高/修改它們,這可能會(huì)破壞你的東西。

確保觸發(fā)meta-data生成,這樣IDE輔助也就可以用于你的keys了,你可能想檢查生成的元數(shù)據(jù)(META-INF/spring-configuration-metadata.json)以確保keys被正確的文檔化。

自動(dòng)配置模塊

自動(dòng)配置模塊包含了使用該library需要的任何東西,它可能還包含配置的keys定義(@ConfigurationProperties)和用于定義組件如何初始化的回調(diào)接口。

注意

你需要將對(duì)該library的依賴標(biāo)記為可選的,這樣在項(xiàng)目中添加該自動(dòng)配置模塊就更容易了。如果你這樣做,該library將不會(huì)提供,Spring Boot會(huì)回退到默認(rèn)設(shè)置。

Starter模塊

starter模塊實(shí)際是一個(gè)空jar,它的目的是提供使用該library所需的必要依賴。不要對(duì)添加你的starter的項(xiàng)目做任何假設(shè),如果你正在自動(dòng)配置的library需要其他starters,一定要提到它。提供一個(gè)合適的默認(rèn)依賴集可能比較困難,特別是存在大量可選依賴時(shí),你應(yīng)該避免引入任何非必需的依賴。

“Spring Boot2中怎么自定義starter”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI