Spring Boot 整合多點套路,少走點彎路~


持續原創輸出,點擊上方藍字關注我

個人原創博客+1,點擊前往,查看更多

目錄

  • 前言
  • Spring Boot 版本
    1. 找到自動配置類
    1. 注意 @Conditionalxxx注解
    1. 注意 EnableConfigurationProperties注解
    1. 注意 @Import注解
    1. 注意 @AutoConfigurexxx注解
    1. 注意內部靜態配置類
  • 總結

前言

網上有很多文章都在說Spring Boot 如何整合 xxx,有文章教你為什么這么整合嗎?整合了千萬個框架,其實套路就那么幾個,干嘛要學千萬個,不如來這學習幾個套路輕松整合,它不香嗎???

今天寫這篇文章的目的就是想從思想上教給大家幾個套路,不用提到整合什么就去百度了,自己嘗試去親手整合一個。

Spring Boot 版本

本文基於的Spring Boot的版本是2.3.4.RELEASE

1. 找到自動配置類

Spring Boot 在整合任何一個組件的時候都會先添加一個依賴starter,比如整合的Mybatis有一個mybatis-spring-boot-starter,依賴如下:

<dependency>
 <groupId>org.mybatis.spring.boot</groupId>  <artifactId>mybatis-spring-boot-starter</artifactId>  <version>2.0.0</version> </dependency> 

每一個starter基本都會有一個自動配置類,命名方式也是類似的,格式為:xxxAutoConfiguration,比如Mybatis的自動配置類就是MybatisAutoConfigurationRedis的自動配置類是RedisAutoConfigurationWEB模塊的自動配置類是WebMvcAutoConfiguration

2. 注意@Conditionalxxx注解

@Conditionalxxx標注在配置類上或者結合@Bean標注在方法上,究竟是什么意思,在上一篇文章這類注解都不知道,還好意思說會Spring Boot已經從表層到底層深入的講了一遍,不理解的可以查閱一下。

首先需要注意自動配置類上的@Conditionalxxx注解,這個是自動配置類生效的條件。

比如WebMvcAutoConfiguration類上標了一個如下注解:

@ConditionalOnMissingBean(WebMvcConfigurationSupport.class) 

以上這行代碼的意思就是當前IOC容器中沒有WebMvcConfigurationSupport這個類的實例時自動配置類才會生效,這也就是在配置類上標注@EnableWebMvc會導致自動配置類WebMvcAutoConfiguration失效的原因。

其次需要注意方法上的@Conditionalxxx注解,Spring Boot會在自動配置類中結合@Bean@Conditionalxxx注解提供一些組件運行的默認配置,但是利用@Conditionalxxx(在特定條件下生效)注解的條件性,方便開發者覆蓋這些配置。

比如在Mybatis的自動配置類MybatisAutoConfiguration中有如下一個方法:

  @Bean
 @ConditionalOnMissingBean  public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {} 

以上這個方法不用看方法體的內容,只看方法上的注解。@Bean這個注解的意思是注入一個BeanIOC容器中,@ConditionalOnMissingBean這個注解就是一個條件判斷了,表示當SqlSessionFactory類型的對象在IOC容器中不存在才會注入。

哦?領悟到了吧,言外之意就是如果開發者需要定制SqlSessionFactory,則可以自己的創建一個SqlSessionFactory類型的對象並且注入到IOC容器中即能覆蓋自動配置類中的。比如在Mybatis配置多數據源的時候就需要定制一個SqlSessionFactory而不是使用自動配置類中的。

總之,一定要注意自動配置類上或者方法上的@Conditionalxxx注解,這個注解表示某種特定條件。

下面列出了常用的幾種注解,如下:

  1. @ConditionalOnBean:當容器中有指定Bean的條件下進行實例化。
  2. @ConditionalOnMissingBean:當容器里沒有指定Bean的條件下進行實例化。
  3. @ConditionalOnClass:當classpath類路徑下有指定類的條件下進行實例化。
  4. @ConditionalOnMissingClass:當類路徑下沒有指定類的條件下進行實例化。
  5. @ConditionalOnWebApplication:當項目是一個Web項目時進行實例化。
  6. @ConditionalOnNotWebApplication:當項目不是一個Web項目時進行實例化。
  7. @ConditionalOnProperty:當指定的屬性有指定的值時進行實例化。
  8. @ConditionalOnExpression:基於SpEL表達式的條件判斷。
  9. @ConditionalOnJava:當JVM版本為指定的版本范圍時觸發實例化。
  10. @ConditionalOnResource:當類路徑下有指定的資源時觸發實例化。
  11. @ConditionalOnJndi:在JNDI存在的條件下觸發實例化。
  12. @ConditionalOnSingleCandidate:當指定的Bean在容器中只有一個,或者有多個但是指定了首選的Bean時觸發實例化。

3. 注意EnableConfigurationProperties注解

EnableConfigurationProperties這個注解常標注在配置類上,使得@ConfigurationProperties標注的配置文件生效,這樣就可以在全局配置文件(application.xxx)配置指定前綴的屬性了。

在Redis的自動配置類RedisAutoConfiguration上方標注如下一行代碼:

@EnableConfigurationProperties(RedisProperties.class) 

這行代碼有意思了,我們可以看看RedisProperties的源碼,如下:

@ConfigurationProperties(prefix = "spring.redis")
public class RedisProperties {  private int database = 0;  private String url;  private String host = "localhost";  private String password;  ..... 

@ConfigurationProperties這個注解指定了全局配置文件中以spring.redis.xxx為前綴的配置都會映射到RedisProperties的指定屬性中,其實RedisProperties這個類中定義了Redis的一些所需屬性,比如hostIP地址密碼等等。

@EnableConfigurationProperties注解就是使得指定的配置生效,能夠將全局配置文件中配置的屬性映射到相關類的屬性中。

為什么要注意@EnableConfigurationProperties這個注解呢?

引入一個組件后往往需要改些配置,我們都知道在全局配置文件中可以修改,但是不知道前綴是什么,可以改哪些屬性,因此找到@EnableConfigurationProperties這個注解后就能找到對應的配置前綴以及可以修改的屬性了。

4. 注意@Import注解

這個注解有點牛逼了,Spring 3.x中就已經有的一個注解,大致的意思的就是快速導入一個Bean或者配置類到IOC容器中。這個注解有很多妙用,后續會單獨寫篇文章介紹下。

@Import這個注解通常標注在自動配置類上方,並且一般都是導入一個或者多個配置類。

比如RabbitMQ的自動配置類RabbitAutoConfiguration上有如下一行代碼:

@Import(RabbitAnnotationDrivenConfiguration.class) 

這行代碼的作用就是添加了RabbitAnnotationDrivenConfiguration這個配置類,使得Spring Boot在加載到自動配置類的時候能夠一起加載。

比如Redis的自動配置類RedisAutoConfiguration上有如下一行代碼:

@Import({ LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class }) 

這個@Import同時引入了LettuceJedis兩個配置類了,因此如果你的Redis需要使用Jedis作為連接池的話,想要知道Jedis都要配置什么,此時就應該看看JedisConnectionConfiguration這個配置類了。

總結@Import標注在自動配置類上方,一般都是快速導入一個或者多個配置類,因此如果自動配置類沒有配置一些東西時,一定要看看@Import這個注解導入的配置類。

5. 注意@AutoConfigurexxx注解

@AutoConfigurexxx這類注解決定了自動配置類的加載順序,比如AutoConfigureAfter(在指定自動配置類之后)、AutoConfigureBefore(在指定自動配置類之前)、AutoConfigureOrder(指定自動配置類的優先級)。

為什么要注意順序呢?因為某些組件往往之間是相互依賴的,比如MybatisDataSource,肯定要先將數據源相關的東西配置成功才能配置Mybatis吧。@AutoConfigurexxx這類注解正是解決了組件之間相互依賴的問題。

比如MybatisAutoConfiguration上方標注了如下一行代碼:

@AutoConfigureAfter(DataSourceAutoConfiguration.class) 

這個行代碼意思很簡單,就是MybatisAutoConfiguration這個自動配置在DataSourceAutoConfiguration這個之后加載,因為你需要我,多么簡單的理由。

好了,這下明白了吧,以后別犯傻問:為什么Mybatis配置好了,啟動會報錯?這個問題先看看數據源有沒有配置成功吧。

6. 注意內部靜態配置類

有些自動配置類比較簡單沒那么多套路,比如RedisAutoConfiguration這個自動配置類中就定義了兩個注入Bean的方法,其他的沒了。

但是有些自動配置類就沒那么單純了,中間能嵌套n個靜態配置類,比如WebMvcAutoConfiguration,類中還嵌套了WebMvcAutoConfigurationAdapterEnableWebMvcConfigurationResourceChainCustomizerConfiguration這三個配置類。如果你光看WebMvcAutoConfiguration這個自動配置類好像沒配置什么,但是其內部卻是大有乾坤啊。

總結:一定要自動配置類的內部嵌套的配置類,真是大有乾坤啊。

總結

以上總結了六條整合的套路,希望能夠幫助讀者擺脫百度,自己也能獨立整合組件。

總之,Spring Boot整合xxx組件的文章很多,相信大家也看的比較懵,其實套路都是一樣,學會陳某分享的套路,讓你少走彎路!!!


免責聲明!

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



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