SpringBoot2.0學習第五篇之autoconfigure自動化配置


何為自動化配置?

通讀全文大概需要1分鍾

4279695-953eb618d2fb3572
image

不知道用過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這個注解主要有什么作用。其實自動化配置的秘密就隱藏在這里。

4279695-6a3c6aaabb7c075d.jpg
image-20190307215219386

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

4279695-8d412f77ea584b00.jpg
image-20190307215359080

秘密就是: EnableAutoConfiguration

這個類的含義就是自動在依賴中找到自動化配置類。為了更簡單的給各位小伙伴說清出。下面

小編舉一個例子thymeleaf。我們看下thymeleaf是如何實現自動化配置的吧。thymeleaf的自動化類就是這個:

ThymeleafAutoConfiguration。 前面我們說了SpringBoot的自動化配置的秘密是EnableAutoConfiguration.。那么我們看ThymeleafAutoConfigurationEnableAutoConfiguration到底有什么關系呢?

謎底大解開

SpringBoot項目啟動類必須要被EnableAutoConfiguration標記,而之所以我們沒有看到是因為,SpringBootApplication已經被EnableAutoConfiguration標記了。

4279695-2bab570098784046.jpg
image-20190307220020658

那么SpringBoot會在他依賴的所有包中去查找一個叫spring.factories的文件,ThymeleafAutoConfigurationEnableAutoConfiguration的關系就在spring.factories里面聲明。我們打開

spring.factories文件發現EnableAutoConfiguration其實於很多的自動化配置做了綁定。當EnableAutoConfiguration被加載其實與其綁定的這么多自動化配置都會選擇的進行啟動。

4279695-adc629199c24741c.jpg
image-20190307220530562
4279695-7929d36fc6c2989f.jpg
image-20190307220551258

到這里我們就知道了為啥當引入了thymeleaf就會自動被整合到SpringBoot中了吧。如果只知道以上這些其實還是不夠的。下面小編提出一個問題。

請思考:

SpringBoot中自動化配置會自動整合ThymeleafAutoConfiguration但是假如我們不引入thymeleaf它的實現類,那么自動整合時候就會報中NoSuchClassException異常。SpringBoot是如何解決呢?

我們看ThymeleafAutoConfiguration是如何實現的。

4279695-2dc261c063fcabbd.jpg
image-20190307221503220

答案就在這些注解上面。

  • @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上一個項目為例

4279695-654d5677a47072fa.jpg
image-20190307221949850

使用方法.(和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的配合類就下面這么簡單。

4279695-1fe9276dd950b8cc.jpg
image-20190307222656553

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

4279695-817d90a902b6b30b.jpg
image-20190307222745611

到這里本篇內容就講完了,相信各位看官已經明白了吧。

獲取本課程代碼請關注頭條號: 軟件編程指南 ,私信: 005

更多了解可以點擊小編博客: https://blog.springlearn.cn/posts/4135/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM