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

個人原創博客+1,點擊前往,查看更多
目錄
-
前言 -
Spring Boot 版本 -
-
找到自動配置類
-
-
-
注意 @Conditionalxxx
注解
-
-
-
注意 EnableConfigurationProperties
注解
-
-
-
注意 @Import
注解
-
-
-
注意 @AutoConfigurexxx
注解
-
-
-
注意內部靜態配置類
-
-
總結
前言
網上有很多文章都在說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的自動配置類就是MybatisAutoConfiguration
,Redis
的自動配置類是RedisAutoConfiguration
,WEB
模塊的自動配置類是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
這個注解的意思是注入一個Bean
到IOC容器
中,@ConditionalOnMissingBean
這個注解就是一個條件判斷了,表示當SqlSessionFactory
類型的對象在IOC容器
中不存在才會注入。
哦?領悟到了吧,言外之意就是如果開發者需要定制SqlSessionFactory
,則可以自己的創建一個SqlSessionFactory
類型的對象並且注入到IOC容器中即能覆蓋自動配置類中的。比如在Mybatis配置多數據源的時候就需要定制一個SqlSessionFactory
而不是使用自動配置類中的。
總之,一定要注意自動配置類上或者方法上的
@Conditionalxxx
注解,這個注解表示某種特定條件。
下面列出了常用的幾種注解,如下:
-
@ConditionalOnBean
:當容器中有指定Bean的條件下進行實例化。 -
@ConditionalOnMissingBean
:當容器里沒有指定Bean的條件下進行實例化。 -
@ConditionalOnClass
:當classpath類路徑下有指定類的條件下進行實例化。 -
@ConditionalOnMissingClass
:當類路徑下沒有指定類的條件下進行實例化。 -
@ConditionalOnWebApplication
:當項目是一個Web項目時進行實例化。 -
@ConditionalOnNotWebApplication
:當項目不是一個Web項目時進行實例化。 -
@ConditionalOnProperty
:當指定的屬性有指定的值時進行實例化。 -
@ConditionalOnExpression
:基於SpEL表達式的條件判斷。 -
@ConditionalOnJava
:當JVM版本為指定的版本范圍時觸發實例化。 -
@ConditionalOnResource
:當類路徑下有指定的資源時觸發實例化。 -
@ConditionalOnJndi
:在JNDI存在的條件下觸發實例化。 -
@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的一些所需屬性,比如host
,IP地址
,密碼
等等。
@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
同時引入了Lettuce
和Jedis
兩個配置類了,因此如果你的Redis需要使用Jedis作為連接池的話,想要知道Jedis都要配置什么,此時就應該看看JedisConnectionConfiguration
這個配置類了。
總結:
@Import
標注在自動配置類上方,一般都是快速導入一個或者多個配置類,因此如果自動配置類沒有配置一些東西時,一定要看看@Import
這個注解導入的配置類。
5. 注意@AutoConfigurexxx注解
@AutoConfigurexxx
這類注解決定了自動配置類的加載順序,比如AutoConfigureAfter
(在指定自動配置類之后)、AutoConfigureBefore
(在指定自動配置類之前)、AutoConfigureOrder
(指定自動配置類的優先級)。
為什么要注意順序呢?因為某些組件往往之間是相互依賴的,比如
Mybatis
和DataSource
,肯定要先將數據源相關的東西配置成功才能配置Mybatis
吧。@AutoConfigurexxx
這類注解正是解決了組件之間相互依賴的問題。
比如MybatisAutoConfiguration
上方標注了如下一行代碼:
@AutoConfigureAfter(DataSourceAutoConfiguration.class)
這個行代碼意思很簡單,就是MybatisAutoConfiguration
這個自動配置在DataSourceAutoConfiguration
這個之后加載,因為你需要我,多么簡單的理由。
好了,這下明白了吧,以后別犯傻問:為什么Mybatis配置好了,啟動會報錯?這個問題先看看數據源有沒有配置成功吧。
6. 注意內部靜態配置類
有些自動配置類比較簡單沒那么多套路,比如RedisAutoConfiguration
這個自動配置類中就定義了兩個注入Bean的方法,其他的沒了。
但是有些自動配置類就沒那么單純了,中間能嵌套n
個靜態配置類,比如WebMvcAutoConfiguration
,類中還嵌套了WebMvcAutoConfigurationAdapter
、EnableWebMvcConfiguration
、ResourceChainCustomizerConfiguration
這三個配置類。如果你光看WebMvcAutoConfiguration
這個自動配置類好像沒配置什么,但是其內部卻是大有乾坤啊。
總結:一定要自動配置類的內部嵌套的配置類,真是大有乾坤啊。
總結
以上總結了六條整合的套路,希望能夠幫助讀者擺脫百度,自己也能獨立整合組件。
總之,Spring Boot整合xxx組件的文章很多,相信大家也看的比較懵,其實套路都是一樣,學會陳某分享的套路,讓你少走彎路!!!
