日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
如何開發(fā)自己的SpringBootStarter

我們在使用 Spring Boot 的過程中,往往都是在pom.xml里加了一系列的依賴,然后啟支一個包含main方法的Application,一切就OK啦。給你我的感覺,就像是自己要動手做個菜,自己不再需要準備每一部分的原材料,直接購買包裝好的一份菜的原料,下鍋即可。

東風網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)公司!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站開發(fā)等網(wǎng)站項目制作,到程序開發(fā),運營維護。創(chuàng)新互聯(lián)公司于2013年創(chuàng)立到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)公司。

那我們詳細看下,這份「包裝好」的原料中,到底做了些什么。

添加Starter依賴

這里添加的依賴,除了我們之前在Maven中熟悉的之外,還有一些都是長這個樣子:

名為xxx-starter,比如

 
 
 
 
  1.       org.springframework.boot
  2.       spring-boot-starter-web
  3.     org.mybatis.spring.boot
  4.     mybatis-spring-boot-starter
  5.     1.3.2

具體這些starter是怎么起作用的呢,他們什么時候開始工作的?

一切都要從入口處說起。我們以上面的starter為例,看到這個mybatis的starter,其對應(yīng)的pom中,包含這些依賴

 
 
 
 
  1.     
  2.       org.springframework.boot
  3.       spring-boot-starter
  4.     
  5.     
  6.       org.springframework.boot
  7.       spring-boot-starter-jdbc
  8.     
  9.     
  10.       org.mybatis.spring.boot
  11.       mybatis-spring-boot-autoconfigure
  12.     
  13.     
  14.       org.mybatis
  15.       mybatis
  16.     
  17.     
  18.       org.mybatis
  19.       mybatis-spring
  20.     
  21.   

我們看到,相當于我們添加了一個Starter的依賴,其背后會引入許多其定義的其他依賴,通過 Maven 的傳遞依賴,這些都會被自動添加了進來。

自動配置

相比傳統(tǒng)的依賴,我們看到其中包含這樣一個:mybatis-spring-boot-autoconfigure,這也是每個Starter的秘密所在:「AutoConfigure」

它會在實現(xiàn)時,考慮應(yīng)用中的其他部分因素,「推斷」你所需要的 Spring 配置。

在Spring Boot中,我們***的感受是配置仿佛都被做好了,直接使用即可,這就是

spring-boot-autoconfigure. 每個starter都有一個名為spring.factories

的文件,存放在META-INF目錄下,其中的內(nèi)容類似下面這個樣子:

 
 
 
 
  1. # Auto Configure
  2. org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  3. org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration

所有需要自動配置的Class,都需要配置成key是EnableAutoConfiguration的。

我們來看類的內(nèi)部

 
 
 
 
  1. @Configuration
  2. @ConditionalOnClass({SqlSessionFactory.class, SqlSessionFactoryBean.class})
  3. @ConditionalOnBean({DataSource.class})
  4. @EnableConfigurationProperties({MybatisProperties.class})
  5. @AutoConfigureAfter({DataSourceAutoConfiguration.class})
  6. public class MybatisAutoConfiguration {

Class 之上, 有不少注解來標識,有幾點需要關(guān)注的:

  • 其中有標準的 Spring 配置注解 @Configuration
  • 幾個@ConditionalXX
  • 標識執(zhí)行順序的@AutoConfigureAfter

其中,@ConditionalOnClass 標識 SqlSessionFactory類存在時,執(zhí)行該配置, @ConditionalOnBean標識DataSource Bean在 Spring Context時,執(zhí)行配置。

這些spring.factories是怎么被識別的呢? 這就得夸下 Spring 的FactoriesLoader了。

看下官方文檔說明

  • Auto-configuration classes are regular Spring {@link Configuration} beans. They are located using the {@link SpringFactoriesLoader} mechanism (keyed against this class).
  • Generally auto-configuration beans are {@link Conditional @Conditional} beans (most
  • often using {@link ConditionalOnClass @ConditionalOnClass} and
  • {@link ConditionalOnMissingBean @ConditionalOnMissingBean} annotations).

啟動的時候,根據(jù)ClassLoader中的jar,掃描所有 spring.factories,將其中符合條件的過濾出來,執(zhí)行對應(yīng)的配置。重點可以關(guān)注下

 
 
 
 
  1. protected List getAutoConfigurationImportFilters() {
  2.        return SpringFactoriesLoader.loadFactories(AutoConfigurationImportFilter.class,
  3.                this.beanClassLoader);
  4.    }
 
 
 
 
  1.            AutoConfigurationMetadata autoConfigurationMetadata) {
  2.         long startTime = System.nanoTime();
  3.         String[] candidates = StringUtils.toStringArray(configurations);
  4.         boolean[] skip = new boolean[candidates.length];
  5.         boolean skipped = false;
  6.         for (AutoConfigurationImportFilter filter : getAutoConfigurationImportFilters()) {
  7.             invokeAwareMethods(filter);
  8.             boolean[] match = filter.match(candidates, autoConfigurationMetadata);
  9.             for (int i = 0; i < match.length; i++) {
  10.                 if (!match[i]) {
  11.                     skip[i] = true;
  12.                     skipped = true;
  13.                 }
  14.             }
  15.         }
  16.         if (!skipped) {
  17.             return configurations;
  18.         }
  19.         List result = new ArrayList<>(candidates.length);
  20.         for (int i = 0; i < candidates.length; i++) {
  21.             if (!skip[i]) {
  22.                 result.add(candidates[i]);
  23.             }
  24.         }
  25.         return new ArrayList<>(result);
  26.     }
  27. public String[] selectImports(AnnotationMetadata annotationMetadata) {
  28.         if (!isEnabled(annotationMetadata)) {
  29.             return NO_IMPORTS;
  30.         }
  31.         AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader
  32.                 .loadMetadata(this.beanClassLoader);
  33.         AnnotationAttributes attributes = getAttributes(annotationMetadata);
  34.         List configurations = getCandidateConfigurations(annotationMetadata,
  35.                 attributes);
  36.         configurations = removeDuplicates(configurations);
  37.         Set exclusions = getExclusions(annotationMetadata, attributes);
  38.         checkExcludedClasses(configurations, exclusions);
  39.         configurations.removeAll(exclusions);
  40.         configurations = filter(configurations, autoConfigurationMetadata);
  41.         fireAutoConfigurationImportEvents(configurations, exclusions);
  42.         return StringUtils.toStringArray(configurations);
  43.     }

經(jīng)過這里的執(zhí)行之后, filter方法把符合條件的過濾出來了。

創(chuàng)建自定義Starter

經(jīng)過上面兩步,我們大概知道 Starter的工作原理。有時候,我們需要對外提供一些工具組件時,也想以 Starter 的形式提供出來,供別人使用。步驟也還算清晰,照葫蘆畫瓢。

  • 先創(chuàng)建自己的模塊
  • 增加需要用到的依賴
  • 創(chuàng)建對應(yīng)的 AutoConfiguration類
  • 創(chuàng)建META-INF/spring.factories 文件

此時,就不需要再將 Spring Boot 做為 Parent依賴,在單獨的依賴中增加

 
 
 
 
  1.          org.springframework.boot
  2.          spring-boot-autoconfigure
  3.          2.0.6.RELEASE
  4.      
  5.      
  6.          org.springframework.boot
  7.          spring-boot-starter
  8.          2.0.6.RELEASE
  9.      

AutoConfiguration類也簡單,照上面的創(chuàng)建一個

 
 
 
 
  1. @Configuration
  2. @ConditionalOnClass(HelloService.class)
  3. public class HelloServiceAutoConfiguration {

然后,增加文件

 
 
 
 
  1. org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.example.demo.HelloServiceAutoConfiguration

在需要這個服務(wù)的地方,直接引入依賴就OK啦。

【本文為專欄作者“侯樹成”的原創(chuàng)稿件,轉(zhuǎn)載請通過作者微信公眾號『Tomcat那些事兒』獲取授權(quán)】


分享名稱:如何開發(fā)自己的SpringBootStarter
文章位置:http://www.5511xx.com/article/dhcsjod.html