您好,登錄后才能下訂單哦!
本篇內容介紹了“Spring Boot2中怎么自定義starter”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
Spring Boot為內嵌的Tomcat(8和7),Jetty 9和Undertow提供WebSockets自動配置。如果你正在將war包部署到獨立容器中,Spring Boot將假設該容器會負責配置WebSocket。Spring框架提供豐富的WebSocket支持,只需要添加spring-boot-starter-websocket模塊即可。
Spring Boot提供Web Services自動配置,你需要的就是定義Endpoints。通過添加spring-boot-starter-webservices模塊可以獲取Spring Web Services特性。
如果你在公司里開發共享libraries,或者正在開發一個開源或商業library,你可能想開發自己的自動配置(auto-configuration)。自動配置類可以打包到外部jars,并且依舊可以被Spring Boot識別。自動配置可以關聯一個”starter”,用于提供auto-configuration的代碼及需要引用的libraries。我們首先講解構建自己的auto-configuration需要知道哪些內容,。
注意
可參考demo工程了解如何一步步創建一個starter。
從底層來講,自動配置(auto-configuration)是通過標準的@Configuration類實現的。此外,@Conditional注解用來約束自動配置生效的條件。通常自動配置類需要使用@ConditionalOnClass和@ConditionalOnMissingBean注解,這是為了確保只有在相關的類被發現及沒有聲明自定義的@Configuration時才應用自動配置,具體查看spring-boot-autoconfigure源碼中的@Configuration類(META-INF/spring.factories文件)。
Spring Boot會檢查你發布的jar中是否存在META-INF/spring.factories文件,該文件中以EnableAutoConfiguration為key的屬性應該列出你的配置類:
11 org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
22 com.mycorp.libx.autoconfigure.LibXAutoConfiguration,\
33 com.mycorp.libx.autoconfigure.LibXWebAutoConfiguration
你可以使用@AutoConfigureAfter或@AutoConfigureBefore注解為配置類指定特定的順序。例如,如果你提供web-specific配置,你的類就需要應用在WebMvcAutoConfiguration后面。
你也可以使用@AutoconfigureOrder注解為那些相互不知道存在的自動配置類提供排序,該注解語義跟常規的@Order注解相同,但專為自動配置類提供順序。
注意
自動配置類只能通過這種方式加載,確保它們定義在一個特殊的package中,特別是不能成為組件掃描的目標。
你幾乎總是需要在自己的自動配置類里添加一個或更多的@Conditional注解。@ConditionalOnMissingBean注解是一個常見的示例,開發者可以用它覆蓋自動配置類提供的默認行為。
Spring Boot包含很多@Conditional注解,你可以在自己的代碼中通過注解@Configuration類或單獨的@Bean方法來重用它們。
@ConditionalOnClass和@ConditionalOnMissingClass注解可以根據特定類是否出現來決定配置的包含,由于注解元數據是使用ASM來解析的,所以你可以使用value屬性來引用真正的類,即使該類沒有出現在運行應用的classpath下,也可以使用name屬性如果你傾向于使用字符串作為類名。
@ConditionalOnBean和@ConditionalOnMissingBean注解可以根據特定類是否存在決定bean的包含,你可以使用value屬性指定beans(by type),也可以使用name定義beans(by name),search屬性用于限制搜索beans時需要考慮的ApplicationContext層次。
注意
你需要注意bean定義添加的順序,因為這些條件的計算是基于目前處理內容的。出于這個原因,我們推薦在自動配置類上只使用@ConditionalOnBean和@ConditionalOnMissingBean注解(即使保證它們在其他用戶定義的beans后加載)。
注意
@ConditionalOnBean和@ConditionalOnMissingBean不會阻止@Configuration類的創建,在類級別使用那些conditions跟使用注解標記每個@Bean方法是等價的。
@ConditionalOnProperty注解可以根據一個Spring Environment屬性來決定是否包含配置,使用prefix和name屬性指定要檢查的配置。默認情況下,任何存在的只要不是false的屬性都會匹配,你也可以使用havingValue和matchIfMissing屬性創建更高級的檢測。
@ConditionalOnResource注解只在特定資源出現時才會包含配置,可以使用常見的Spring約定命名資源,例如file:/home/user/test.dat。
@ConditionalOnWebApplication和@ConditionalOnNotWebApplication注解可以根據應用是否為’web應用’來決定是否包含配置,web應用是任何使用Spring WebApplicationContext,定義一個session作用域,或有一個StandardServletEnvironment的應用。
@ConditionalOnExpression注解可以根據SpEL表達式結果來決定是否包含配置。
一個完整的Spring Boot starter可能包含以下組件:
autoconfigure模塊,包含自動配置類的代碼。
starter模塊,提供自動配置模塊及其他有用的依賴,簡而言之,添加本starter就能開始使用該library。
注意
如果不需要將它們分離開來,你可以將自動配置代碼和依賴管理放到一個單一模塊中。
確保為你的starter提供一個合適的命名空間(namespace),模塊名不要以spring-boot作為開頭,盡管使用一個不同的Maven groupId,未來我們可能會為你正在做的自動配置提供官方支持。
這里是經驗之談,假設你正在為“acme”創建一個starter,命名自動配置模塊為acme-spring-boot-autoconfigure,命名starter為acme-spring-boot-starter,如果只有一個模塊結合它們,通常會使用acme-spring-boot-starter。
此外,如果你的starter提供配置keys,需要為它們提供一個合適的命名空間,特別是不要使用Spring Boot的命名空間(比如,server,management,spring等),這些是屬于Spring Boot的,我們可能會在將來以相同方式提高/修改它們,這可能會破壞你的東西。
確保觸發meta-data生成,這樣IDE輔助也就可以用于你的keys了,你可能想檢查生成的元數據(META-INF/spring-configuration-metadata.json)以確保keys被正確的文檔化。
自動配置模塊包含了使用該library需要的任何東西,它可能還包含配置的keys定義(@ConfigurationProperties)和用于定義組件如何初始化的回調接口。
注意
你需要將對該library的依賴標記為可選的,這樣在項目中添加該自動配置模塊就更容易了。如果你這樣做,該library將不會提供,Spring Boot會回退到默認設置。
starter模塊實際是一個空jar,它的目的是提供使用該library所需的必要依賴。不要對添加你的starter的項目做任何假設,如果你正在自動配置的library需要其他starters,一定要提到它。提供一個合適的默認依賴集可能比較困難,特別是存在大量可選依賴時,你應該避免引入任何非必需的依賴。
“Spring Boot2中怎么自定義starter”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。