自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

如何開(kāi)發(fā)自己的Spring Boot Starter

開(kāi)發(fā) 開(kāi)發(fā)工具
我們?cè)谑褂?Spring Boot 的過(guò)程中,往往都是在pom.xml里加了一系列的依賴,然后啟支一個(gè)包含main方法的Application,一切就OK啦。

我們?cè)谑褂?Spring Boot 的過(guò)程中,往往都是在pom.xml里加了一系列的依賴,然后啟支一個(gè)包含main方法的Application,一切就OK啦。給你我的感覺(jué),就像是自己要?jiǎng)邮肿鰝€(gè)菜,自己不再需要準(zhǔn)備每一部分的原材料,直接購(gòu)買包裝好的一份菜的原料,下鍋即可。

那我們?cè)敿?xì)看下,這份「包裝好」的原料中,到底做了些什么。

[[257216]]

添加Starter依賴

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

名為xxx-starter,比如

  1. <dependency> 
  2.       <groupId>org.springframework.boot</groupId> 
  3.       <artifactId>spring-boot-starter-web</artifactId> 
  4. </dependency> 
  5. <dependency> 
  6.     <groupId>org.mybatis.spring.boot</groupId> 
  7.     <artifactId>mybatis-spring-boot-starter</artifactId> 
  8.     <version>1.3.2</version> 
  9. </dependency> 

具體這些starter是怎么起作用的呢,他們什么時(shí)候開(kāi)始工作的?

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

  1. <dependencies> 
  2.     <dependency> 
  3.       <groupId>org.springframework.boot</groupId> 
  4.       <artifactId>spring-boot-starter</artifactId> 
  5.     </dependency> 
  6.     <dependency> 
  7.       <groupId>org.springframework.boot</groupId> 
  8.       <artifactId>spring-boot-starter-jdbc</artifactId> 
  9.     </dependency> 
  10.     <dependency> 
  11.       <groupId>org.mybatis.spring.boot</groupId> 
  12.       <artifactId>mybatis-spring-boot-autoconfigure</artifactId> 
  13.     </dependency> 
  14.     <dependency> 
  15.       <groupId>org.mybatis</groupId> 
  16.       <artifactId>mybatis</artifactId> 
  17.     </dependency> 
  18.     <dependency> 
  19.       <groupId>org.mybatis</groupId> 
  20.       <artifactId>mybatis-spring</artifactId> 
  21.     </dependency> 
  22.   </dependencies> 

我們看到,相當(dāng)于我們添加了一個(gè)Starter的依賴,其背后會(huì)引入許多其定義的其他依賴,通過(guò) Maven 的傳遞依賴,這些都會(huì)被自動(dòng)添加了進(jìn)來(lái)。

自動(dòng)配置

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

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

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

spring-boot-autoconfigure. 每個(gè)starter都有一個(gè)名為spring.factories

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

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

所有需要自動(dòng)配置的Class,都需要配置成key是EnableAutoConfiguration的。

我們來(lái)看類的內(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 之上, 有不少注解來(lái)標(biāo)識(shí),有幾點(diǎn)需要關(guān)注的:

  • 其中有標(biāo)準(zhǔn)的 Spring 配置注解 @Configuration
  • 幾個(gè)@ConditionalXX
  • 標(biāo)識(shí)執(zhí)行順序的@AutoConfigureAfter

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

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

看下官方文檔說(shuō)明

  • 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).

 

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

  1. protected List<AutoConfigurationImportFilter> 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<String> 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.  
  28.  
  29. public String[] selectImports(AnnotationMetadata annotationMetadata) { 
  30.         if (!isEnabled(annotationMetadata)) { 
  31.             return NO_IMPORTS; 
  32.         } 
  33.         AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader 
  34.                 .loadMetadata(this.beanClassLoader); 
  35.         AnnotationAttributes attributes = getAttributes(annotationMetadata); 
  36.         List<String> configurations = getCandidateConfigurations(annotationMetadata, 
  37.                 attributes); 
  38.         configurations = removeDuplicates(configurations); 
  39.         Set<String> exclusions = getExclusions(annotationMetadata, attributes); 
  40.         checkExcludedClasses(configurations, exclusions); 
  41.         configurations.removeAll(exclusions); 
  42.         configurations = filter(configurations, autoConfigurationMetadata); 
  43.         fireAutoConfigurationImportEvents(configurations, exclusions); 
  44.         return StringUtils.toStringArray(configurations); 
  45.     } 

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

創(chuàng)建自定義Starter

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

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

此時(shí),就不需要再將 Spring Boot 做為 Parent依賴,在單獨(dú)的依賴中增加

  1. <dependency> 
  2.          <groupId>org.springframework.boot</groupId> 
  3.          <artifactId>spring-boot-autoconfigure</artifactId> 
  4.          <version>2.0.6.RELEASE</version> 
  5.      </dependency> 
  6.      <dependency> 
  7.          <groupId>org.springframework.boot</groupId> 
  8.          <artifactId>spring-boot-starter</artifactId> 
  9.          <version>2.0.6.RELEASE</version> 
  10.      </dependency> 

AutoConfiguration類也簡(jiǎn)單,照上面的創(chuàng)建一個(gè)

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

然后,增加文件

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

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

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

戳這里,看該作者更多好文

責(zé)任編輯:趙寧寧 來(lái)源: 51CTO專欄
相關(guān)推薦

2021-07-26 11:09:43

NacosSpring Boot配置

2021-08-31 09:57:36

云原生消息隊(duì)列

2021-04-08 09:35:10

瀏覽器 Chrome Google

2020-09-27 11:35:16

Spring BootStarterJava

2024-09-29 10:34:31

FlaskPythonAPI

2023-03-27 08:28:57

spring代碼,starter

2024-03-18 18:07:38

VSCode插件文件

2019-04-15 08:32:25

Spring Boot日志門(mén)面模式

2015-06-08 14:27:35

谷歌蘋(píng)果編程語(yǔ)言

2013-03-18 16:09:27

JavaEEOpenfire

2024-03-15 08:00:00

2023-07-21 12:49:15

蘋(píng)果GPT人工智能

2010-07-07 11:07:51

操作系統(tǒng)

2022-11-28 10:22:51

nodeJs開(kāi)發(fā)圖床應(yīng)用

2024-01-18 07:53:37

2022-08-11 07:32:51

Starter自動(dòng)裝配

2023-04-19 15:19:23

微軟人工智能芯片

2023-02-26 10:14:51

Spring第三方庫(kù)

2021-02-03 09:04:11

解密Spring配置

2023-02-26 00:00:01

Spring數(shù)據(jù)庫(kù)組件
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)