何為自動化配置?
通讀全文大概需要1分鍾

不知道用過SpringBoot的同學,有沒有發現在SpringBoot的maven依賴中經常會有很多的starter之類的依賴,往往這些依賴的框架,在加入到pom之后,當應用啟動時候就會自動的被應用整合起來
比如昨天我們的thymeleaf教程中,SpringBoot在整合thymeleaf
的時候,只是引入了spring-boot-starter-thymeleaf
依賴就可以直接使用了,類似的還有很多。
比如: 自動整合freemarker
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
自動整合mybatis
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
現在不懂這些都沒關系,本節課小編就教大家如何使用自動化配置。
說道自動化配置這其實是SpringBoot的一個小特性。不知道有沒有同學仔細研究過SpringBootApplication
這個注解主要有什么作用。其實自動化配置的秘密就隱藏在這里。

跟着小編來找一下秘密到底在哪里。

秘密就是: EnableAutoConfiguration
這個類的含義就是自動在依賴中找到自動化配置類。為了更簡單的給各位小伙伴說清出。下面
小編舉一個例子thymeleaf
。我們看下thymeleaf
是如何實現自動化配置的吧。thymeleaf
的自動化類就是這個:
ThymeleafAutoConfiguration
。 前面我們說了SpringBoot的自動化配置的秘密是EnableAutoConfiguration
.。那么我們看ThymeleafAutoConfiguration
和EnableAutoConfiguration
到底有什么關系呢?
謎底大解開
SpringBoot項目啟動類必須要被EnableAutoConfiguration
標記,而之所以我們沒有看到是因為,SpringBootApplication
已經被EnableAutoConfiguration
標記了。

那么SpringBoot會在他依賴的所有包中去查找一個叫spring.factories
的文件,ThymeleafAutoConfiguration
和EnableAutoConfiguration
的關系就在spring.factories
里面聲明。我們打開
spring.factories
文件發現EnableAutoConfiguration
其實於很多的自動化配置做了綁定。當EnableAutoConfiguration
被加載其實與其綁定的這么多自動化配置都會選擇的進行啟動。


到這里我們就知道了為啥當引入了thymeleaf
就會自動被整合到SpringBoot中了吧。如果只知道以上這些其實還是不夠的。下面小編提出一個問題。
請思考:
SpringBoot中自動化配置會自動整合ThymeleafAutoConfiguration
但是假如我們不引入thymeleaf
它的實現類,那么自動整合時候就會報中NoSuchClassException
異常。SpringBoot是如何解決呢?
我們看ThymeleafAutoConfiguration
是如何實現的。

答案就在這些注解上面。
- @ConditionalOnClass : classpath中存在該類時起效
- @ConditionalOnMissingClass : classpath中不存在該類時起效
- @ConditionalOnBean : DI容器中存在該類型Bean時起效
- @ConditionalOnMissingBean : DI容器中不存在該類型Bean時起效
- @ConditionalOnSingleCandidate : DI容器中該類型Bean只有一個或@Primary的只有一個時起效
- @ConditionalOnExpression : SpEL表達式結果為true時
- @ConditionalOnProperty : 參數設置或者值一致時起效
- @ConditionalOnResource : 指定的文件存在時起效
- @ConditionalOnJndi : 指定的JNDI存在時起效
- @ConditionalOnJava : 指定的Java版本存在時起效
- @ConditionalOnWebApplication : Web應用環境下起效
- @ConditionalOnNotWebApplication : 非Web應用環境下起效
SpringBoot如何來判斷是否啟動自動化配置,防止報錯呢? 就是通過上面的條件注解來實現。只要滿足條件的配置類,才會被整合進去。
實現一個自動化配置項目實戰?
我們以github上一個項目為例

使用方法.(和SpringCloud中Hystrix的使用方法類似,當getUserName出現報錯之后,就返回其指定的備用方法)
@Service
public class UserServiceImpl {
@TurnoffCommand(fallbackMethod = "getBreakUserName")
public String getUserName(String name) {
throw new RuntimeException();
}
public String getBreakUserName(String name) {
return "Mock用戶id:" + name;
}
}
該項目可以自動化配置.
<!--熔斷-->
<dependency>
<groupId>com.github.lxchinesszz</groupId>
<artifactId>turnoff-spring-boot-starter</artifactId>
<version>1.0.1</version>
</dependency>
我們看他是如何實現自動化配置的吧。
Turnoff的配合類就下面這么簡單。

只用在META-INF目錄中創建一個spring.factories就可以實現。是不是很簡單。

到這里本篇內容就講完了,相信各位看官已經明白了吧。
獲取本課程代碼請關注頭條號: 軟件編程指南 ,私信: 005
更多了解可以點擊小編博客: https://blog.springlearn.cn/posts/4135/