SpringBoot為我們提供了靈活強大的自動設定與起步依賴功能,接下來我們參考其實現原理,實現專屬於我們自己的自動設定與起步依賴。
不僅如此,我們對其稍作修改,讓它適用於非SpringBoot環境,甚至是低版本的Spring Framework環境
在編寫自己的自動設定之前,我們先來看一下SpringBoot自動設定類的實現原理。
SpringBoot可以根據CLASSPATH、設定項等條件自動進行常規設定,省去了我們自己手動把一模一樣的設定複製來複制去的麻煩。這樣大大提升了開發效率!
在這之前,我們已經看到過@SpringBootApplication註解了,檢視這個註解,可以發現它上面新增了一個@EnableAutoConfiguration,基於這個註解就可以開啟自動設定功能。
這兩個註解上都有exclude屬性,我們可以在其中排除一些不想啟用的自動設定類。
如果不想啟用自動設定功能,也可以在組態檔中設定spring.boot.enableautoconfiguration=false,關閉該功能。
自動設定類其實就是新增了@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應用程式 |