精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

如何開發自己的Spring Boot Starter

開發 開發工具
我們在使用 Spring Boot 的過程中,往往都是在pom.xml里加了一系列的依賴,然后啟支一個包含main方法的Application,一切就OK啦。

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

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

[[257216]]

添加Starter依賴

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

名為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是怎么起作用的呢,他們什么時候開始工作的?

一切都要從入口處說起。我們以上面的starter為例,看到這個mybatis的starter,其對應的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> 

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

自動配置

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

它會在實現時,考慮應用中的其他部分因素,「推斷」你所需要的 Spring 配置。

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

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

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

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

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

我們來看類的內部

  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 之上, 有不少注解來標識,有幾點需要關注的:

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

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

這些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).

 

啟動的時候,根據ClassLoader中的jar,掃描所有 spring.factories,將其中符合條件的過濾出來,執行對應的配置。重點可以關注下

  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.     } 

經過這里的執行之后, filter方法把符合條件的過濾出來了。

創建自定義Starter

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

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

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

  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類也簡單,照上面的創建一個

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

然后,增加文件

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

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

【本文為51CTO專欄作者“侯樹成”的原創稿件,轉載請通過作者微信公眾號『Tomcat那些事兒』獲取授權】

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

責任編輯:趙寧寧 來源: 51CTO專欄
相關推薦

2021-07-26 11:09:43

NacosSpring Boot配置

2021-04-08 09:35:10

瀏覽器 Chrome Google

2021-08-31 09:57:36

云原生消息隊列

2020-09-27 11:35:16

Spring BootStarterJava

2024-09-29 10:34:31

FlaskPythonAPI

2024-03-18 18:07:38

VSCode插件文件

2023-03-27 08:28:57

spring代碼,starter

2019-04-15 08:32:25

Spring Boot日志門面模式

2015-06-08 14:27:35

谷歌蘋果編程語言

2024-03-15 08:00:00

2013-03-18 16:09:27

JavaEEOpenfire

2010-07-07 11:07:51

操作系統

2022-11-28 10:22:51

nodeJs開發圖床應用

2023-07-21 12:49:15

蘋果GPT人工智能

2024-01-18 07:53:37

2022-08-11 07:32:51

Starter自動裝配

2014-08-26 10:05:37

框架開發AngularJS

2023-04-19 15:19:23

微軟人工智能芯片

2023-02-26 10:14:51

Spring第三方庫

2023-02-26 00:00:01

Spring數據庫組件
點贊
收藏

51CTO技術棧公眾號

黄页网站在线看| 国产美女在线精品免费观看| 大吊一区二区三区| 日韩第一区第二区| 同产精品九九九| 亚洲欧美精品| 欧美 日韩 国产 精品| 丝袜亚洲另类欧美| 欧美激情videos| 日本黄色小视频在线观看| 欧美黄色一级| 欧美在线免费视屏| 极品粉嫩国产18尤物| 国产一级片在线播放| 国产在线视频一区二区三区| 奇米影视亚洲狠狠色| 91高清免费看| 欧美三级伦理在线| 欧美一区二区三区人| 国产免费视频传媒| 2021天堂中文幕一二区在线观| 久久久高清一区二区三区| 成人久久精品视频| 五月婷婷六月婷婷| 国内自拍视频一区二区三区| 最近中文字幕mv在线一区二区三区四区| 26uuu国产| 国产精品.xx视频.xxtv| 图片区小说区国产精品视频| 色呦呦网站入口| 丁香婷婷在线观看| 99久久亚洲一区二区三区青草| 成人夜晚看av| 国产农村妇女aaaaa视频| 亚洲视频中文| 超碰日本道色综合久久综合| 天天躁日日躁aaaa视频| 国偷自产视频一区二区久| 欧美区在线观看| 亚洲色图久久久| 成人美女视频| 激情成人在线视频| 日韩小视频网站| xvideos国产在线视频| 国产女人aaa级久久久级| 美女黄毛**国产精品啪啪| 国模私拍视频在线| 国内精品久久久久影院色| 国产精品久久久精品| 欧美国产成人精品一区二区三区| 亚洲国产影院| 久久男人av资源网站| 亚洲av鲁丝一区二区三区 | 国产视频一区二区不卡| 午夜精品久久久久久久96蜜桃 | 国产精品亚洲欧美导航| 日韩精品一区不卡| 久久一区国产| 欧美综合在线观看| 日韩手机在线视频| 国产在线不卡| 久久全国免费视频| 黄色小说在线观看视频| 欧美日韩网站| 欧美精品成人91久久久久久久| 国产这里有精品| 国产精品草草| 国内精品久久久久久| 日本少妇bbwbbw精品| 一区二区91| 欧美在线视频网站| 一级特黄免费视频| 久久99国产精品免费| 成人免费高清完整版在线观看| 国产又粗又长又大视频| 国产麻豆日韩欧美久久| 99久久无色码| 日本精品999| 久久久精品日韩欧美| 手机成人在线| 高清免费电影在线观看| 亚洲在线观看免费| 奇米精品一区二区三区| 韩国女主播一区二区| 欧美精品日韩一本| 性感美女一区二区三区| 欧美a大片欧美片| 国产一区二区三区在线视频| 三级影片在线观看| 亚洲午夜极品| 日韩美女主播视频| 一区二区日韩视频| gogogo免费视频观看亚洲一| 日韩精品不卡| 丝袜国产在线| 色美美综合视频| 在线成人免费av| 香蕉久久精品日日躁夜夜躁| 日韩中文在线中文网在线观看| 青娱乐av在线| 日韩国产成人精品| 99re资源| 成年人在线观看网站| 依依成人综合视频| 农村妇女精品一二区| 日本综合精品一区| 伊人久久综合97精品| 久久久www成人免费毛片| 性欧美精品高清| 91情侣在线视频| 国产1区2区3区在线| 亚洲在线免费播放| 99日在线视频| 精品在线91| 欧美激情久久久久| 中文字幕精品一区二区精| 大桥未久av一区二区三区中文| 午夜精品福利一区二区| 国产福利片在线观看| 欧美日韩高清一区二区| 久久亚洲AV成人无码国产野外 | 亚洲精品蜜桃久久久久久| 日韩和的一区二在线| 精品国产3级a| www.xxxx日本| 视频一区视频二区中文字幕| 国产一区二区自拍| 日本不卡影院| 69成人精品免费视频| 阿v天堂2014| 亚洲欧美成人综合| 国产精品免费一区二区三区| 美女隐私在线观看| 欧美三级视频在线| 波多野结衣一本| 亚洲作爱视频| 国产在线精品一区| 国产美女福利在线观看| 欧美一区二区女人| 黄视频网站免费看| 久久se精品一区二区| 日本一区二区三区视频在线观看| 黄在线观看免费网站ktv| 精品欧美一区二区久久| 一区二区视频免费看| 国产专区欧美精品| 超碰在线免费观看97| а天堂中文最新一区二区三区| 中文字幕精品www乱入免费视频| 四虎影院在线免费播放| 91性感美女视频| 久久精品国产精品亚洲色婷婷| 成人性生交大片免费看中文视频| 欧美激情一区二区三区高清视频| www.激情五月| 亚洲制服丝袜在线| 老熟妇精品一区二区三区| 亚洲人www| 久久久一本精品99久久精品66| 麻豆免费版在线观看| 日韩不卡中文字幕| 久久亚洲精品国产| 国产亚洲短视频| 在线视频日韩一区 | 亚洲午夜无码久久久久| 亚洲国产精品精华液ab| 亚洲这里只有精品| 小说区亚洲自拍另类图片专区| 91久久国产婷婷一区二区| 福利在线视频网站| 亚洲精品在线三区| 国产一级片毛片| 欧美激情一区二区三区| 色91精品久久久久久久久| 影视一区二区| 国产日韩一区欧美| 欧亚一区二区| 欧美成年人视频| 天天综合网在线观看| 日韩欧美亚洲综合| 国产美女高潮视频| 国产.欧美.日韩| 国产精品丝袜久久久久久消防器材 | 色综合网站在线| 国产aaaaaaaaa| 国产精品一区二区在线观看不卡| 无码 制服 丝袜 国产 另类| 亚洲免费专区| 成人黄色免费看| eeuss鲁一区二区三区| 精品亚洲男同gayvideo网站| 中文字幕+乱码+中文字幕明步| 综合激情成人伊人| 在线免费观看a级片| 免费在线看成人av| 欧美日韩福利在线| 91一区二区三区四区| 国产v亚洲v天堂无码| 影视一区二区三区| 欧美激情在线观看视频| 国内精品一区视频| 日韩免费高清视频| 亚洲 小说区 图片区| 亚洲一区在线电影| 国产精品www爽爽爽| 成人免费毛片片v| jizzzz日本| 亚洲女同同性videoxma| 九一免费在线观看| 欧美日韩色图| 久久超碰亚洲| 欧美日韩国产一区二区在线观看| 日本成熟性欧美| 欧美日韩经典丝袜| 色老头一区二区三区| 亚洲区小说区图片区| 日韩一区二区三区av| 亚洲大尺度在线观看| 亚洲午夜私人影院| 国产乱子轮xxx农村| 91免费在线视频观看| 久久黄色一级视频| 看片网站欧美日韩| 97在线免费公开视频| 黄色日韩在线| 国产精品久久久影院| 97色伦图片97综合影院| 欧美一级爽aaaaa大片| 国产精品一线| 波多野结衣久草一区| 日韩色性视频| 国产日韩中文字幕| avav成人| 国产精品第3页| 免费日韩电影| 欧亚精品在线观看| 中文av在线全新| 97欧美精品一区二区三区| 欧美一卡二卡| 欧美国产乱视频| 超碰在线最新| 久久国产视频网站| 大片免费在线观看| 久久久国产精品一区| 在线观看精品一区二区三区| 亚洲午夜久久久久久久| 黄色电影免费在线看| 亚洲男人天堂2023| 国产专区在线播放| 中文字幕不卡在线视频极品| 思思99re6国产在线播放| 在线精品播放av| av影片免费在线观看| 在线视频欧美性高潮| av免费观看一区二区| 中文字幕久精品免费视频| 超碰国产在线| 日韩中文字幕在线视频播放| 久久黄色美女电影| 欧美大码xxxx| 超碰在线资源| 97久久精品视频| 成人做爰视频www网站小优视频| 国产97在线观看| 日韩国产大片| av色综合网| 天堂一区二区三区四区| 日韩电影免费观看在| 日韩伦理视频| 99精品一级欧美片免费播放| 欧美午夜影院| 国产超级av在线| 蜜芽一区二区三区| 青青草精品在线| 99国产精品国产精品久久| 成人性生交大免费看| 亚洲欧洲国产专区| 久操免费在线视频| 欧美色道久久88综合亚洲精品| jizz国产在线| 日韩午夜精品视频| 亚洲三级黄色片| 中文综合在线观看| 成人在线app| 琪琪亚洲精品午夜在线| 亚洲欧美综合久久久久久v动漫| 91福利入口| 自拍偷拍一区| 久久精品国产精品亚洲精品色| 亚洲黄色av| 超碰在线公开97| caoporen国产精品视频| 91社区视频在线观看| 亚洲一区二区三区四区在线免费观看 | 成人信息集中地欧美| 高清精品xnxxcom| 日韩在线第一区| 国产一区美女| 久久99999| 97久久超碰国产精品| 国产又粗又长又硬| 精品久久久久久中文字幕一区奶水| 国产乡下妇女三片| 精品国产一区二区在线观看| 成人在线观看一区| 久久久久久av| 亚洲热av色在线播放| 久久国产精品99久久久久久丝袜| 日韩精品久久久免费观看| 男人天堂中文字幕| 欧美三级免费观看| 国产精品高潮呻吟av| 亚洲国产美女精品久久久久∴| 国产三级电影在线| 欧美大片网站在线观看| 日韩国产网站| 国产精品视频免费一区| 日本大胆欧美| 中文字幕无码精品亚洲35| 久久99国产精品久久99| 丝袜美腿中文字幕| 亚洲午夜免费福利视频| 国产又大又黑又粗| 一区二区欧美激情| 女厕盗摄一区二区三区| www 成人av com| 久久一区二区三区喷水| 国产精品亚洲αv天堂无码| 高清久久久久久| 日韩一级片av| 欧美日韩一级片网站| 激情综合闲人网| 日本最新高清不卡中文字幕| 97青娱国产盛宴精品视频| 麻豆中文字幕在线观看| 日本不卡免费在线视频| 精品欧美一区二区久久久| 欧美日韩一区二区免费在线观看| www.五月婷| 欧美高清视频在线观看| 亚洲一级大片| www.18av.com| 国产成人精品影视| 久久久久久久极品内射| 日韩视频免费观看高清完整版| 国产二区三区在线| 18成人在线| 国产精品多人| 理论片大全免费理伦片| 亚洲成人黄色影院| 欧美自拍第一页| 国自产精品手机在线观看视频| 96sao在线精品免费视频| 久久手机在线视频| 成人一级片在线观看| 日本一级淫片色费放| 亚洲国产免费av| 中文字幕在线免费观看视频| 欧美色欧美亚洲另类七区| 葵司免费一区二区三区四区五区| 一道本在线观看| 欧美日韩一区二区三区不卡| 免费网站成人| 亚洲综合在线中文字幕| 亚洲私拍自拍| 久久成人激情视频| 欧美日韩www| 七七久久电影网| 久久综合福利| 麻豆极品一区二区三区| 久草网站在线观看| 日韩av网址在线观看| 天天免费亚洲黑人免费| 伊人色综合久久天天五月婷| 国产精品正在播放| 丰满少妇乱子伦精品看片| 亚洲图片在区色| www.成人在线.com| 欧美性大战久久久久xxx| 国产婷婷一区二区| 国产欧美一级片| 91精品国产沙发| 不卡中文字幕| 免费高清视频在线观看| 欧美三级xxx| а√天堂官网中文在线| 久久久一本精品99久久精品| 理论片日本一区| 精品成人久久久| 最新国产成人av网站网址麻豆| 欧美精品三级在线| 日本xxxxxxx免费视频| 亚洲少妇屁股交4| 亚洲区小说区图片区| 91免费国产视频| 米奇777在线欧美播放| 丰满少妇高潮久久三区| 亚洲色图日韩av| 中文一区二区三区四区| 美女喷白浆视频|