SpringBoot——自定義自動設定與起步依賴

2023-03-18 06:00:31

SpringBoot——自定義自動設定與起步依賴

SpringBoot為我們提供了靈活強大的自動設定與起步依賴功能,接下來我們參考其實現原理,實現專屬於我們自己的自動設定與起步依賴。
不僅如此,我們對其稍作修改,讓它適用於非SpringBoot環境,甚至是低版本的Spring Framework環境

1自動設定

在編寫自己的自動設定之前,我們先來看一下SpringBoot自動設定類的實現原理。

SpringBoot可以根據CLASSPATH、設定項等條件自動進行常規設定,省去了我們自己手動把一模一樣的設定複製來複制去的麻煩。這樣大大提升了開發效率!
在這之前,我們已經看到過@SpringBootApplication註解了,檢視這個註解,可以發現它上面新增了一個@EnableAutoConfiguration,基於這個註解就可以開啟自動設定功能。
這兩個註解上都有exclude屬性,我們可以在其中排除一些不想啟用的自動設定類。
如果不想啟用自動設定功能,也可以在組態檔中設定spring.boot.enableautoconfiguration=false,關閉該功能。

1.1自動設定的實現原理

自動設定類其實就是新增了@Configuration的普通Java設定類,它利用Spring Framework 4.0加入的條件註解@Conditional來實現「根據特定條件啟用相關設定類」,註解中傳入的Condition類就是不同條件的判斷邏輯。SpringBoot內建了很多條件註解,如下表所示:

條件註解 生效條件
@ConditionalOnBean 存在特定名稱、特定型別、特定泛型引數或帶有特定註解的Bean
@ConditionalOnMissingBean 與前者相反,不存在特定的Bean
@ConditionalOnClass 存在特定的類
@ConditionalOnMissingClass 與前者相反,不存在特定類
@ConditionalOnCloudPlatform 執行在特定的雲平臺上,截止2.6.3版本,代表雲平臺的列舉類支援無雲平臺,可以通過spring.main.cloud-platform設定強制使用的雲平臺
@ConditionalOnExpression 指定的SpEL表示式為真
@ConditionalOnJava 執行在滿足條件的Java上,可以比指定版本新,也可以比指定版本舊
@ConditionalOnJndi 指定的JNDI位置必須存在一個,如沒有指定,則需要存在InitalContext
@ConditionalOnProperty 屬性值滿足特定條件,比如給定的屬性值都不能為false
@ConditionalOnResource 存在特定資源
@ConditionalOnSingleCandidate 當前上下文中,特定型別的Bean有且僅有一個
@ConditionalOnWarDeployment 應用程式是通過傳統的War方式部署的,而非內嵌容器
@ConditionalOnWebApplication 應用程式是一個Web應用程式
@ConditionalOnNotWebApplication 與前者相反,應用程式不是一個Web應用程式