SpringBoot 自定義啟動器

Spring Boot應(yīng)用啟動器基本的一共有44種,具體如下:

1)spring-boot-starter
這是Spring Boot的核心啟動器党涕,包含了自動配置、日志和YAML刊头。

2)spring-boot-starter-actuator
幫助監(jiān)控和管理應(yīng)用逛绵。

3)spring-boot-starter-amqp
通過spring-rabbit來支持AMQP協(xié)議(Advanced Message Queuing Protocol)型酥。

4)spring-boot-starter-aop
支持面向方面的編程即AOP椎例,包括spring-aop和AspectJ。

5)spring-boot-starter-artemis
通過Apache Artemis支持JMS的API(Java Message Service API)隙疚。

6)spring-boot-starter-batch
支持Spring Batch,包括HSQLDB數(shù)據(jù)庫磕道。

7)spring-boot-starter-cache
支持Spring的Cache抽象供屉。

8)spring-boot-starter-cloud-connectors
支持Spring Cloud Connectors,簡化了在像Cloud Foundry或Heroku這樣的云平臺上連接服務(wù)溺蕉。

9)spring-boot-starter-data-elasticsearch
支持ElasticSearch搜索和分析引擎伶丐,包括spring-data-elasticsearch。

10)spring-boot-starter-data-gemfire
支持GemFire分布式數(shù)據(jù)存儲疯特,包括spring-data-gemfire哗魂。

11)spring-boot-starter-data-jpa
支持JPA(Java Persistence API),包括spring-data-jpa漓雅、spring-orm录别、Hibernate。

12)spring-boot-starter-data-mongodb
支持MongoDB數(shù)據(jù)邻吞,包括spring-data-mongodb组题。

13)spring-boot-starter-data-rest
通過spring-data-rest-webmvc,支持通過REST暴露Spring Data數(shù)據(jù)倉庫抱冷。

14)spring-boot-starter-data-solr
支持Apache Solr搜索平臺崔列,包括spring-data-solr。

15)spring-boot-starter-freemarker
支持FreeMarker模板引擎旺遮。

16)spring-boot-starter-groovy-templates
支持Groovy模板引擎赵讯。

17)spring-boot-starter-hateoas
通過spring-hateoas支持基于HATEOAS的RESTful Web服務(wù)。

18)spring-boot-starter-hornetq
通過HornetQ支持JMS耿眉。

19)spring-boot-starter-integration
支持通用的spring-integration模塊边翼。

20)spring-boot-starter-jdbc
支持JDBC數(shù)據(jù)庫。

21)spring-boot-starter-jersey
支持Jersey RESTful Web服務(wù)框架鸣剪。

22)spring-boot-starter-jta-atomikos
通過Atomikos支持JTA分布式事務(wù)處理组底。

23)spring-boot-starter-jta-bitronix
通過Bitronix支持JTA分布式事務(wù)處理。

24)spring-boot-starter-mail
支持javax.mail模塊西傀。

25)spring-boot-starter-mobile
支持spring-mobile斤寇。

26)spring-boot-starter-mustache
支持Mustache模板引擎。

27)spring-boot-starter-redis
支持Redis鍵值存儲數(shù)據(jù)庫拥褂,包括spring-redis娘锁。

28)spring-boot-starter-security
支持spring-security。

29)spring-boot-starter-social-facebook
支持spring-social-facebook

30)spring-boot-starter-social-linkedin
支持pring-social-linkedin

31)spring-boot-starter-social-twitter
支持pring-social-twitter

32)spring-boot-starter-test
支持常規(guī)的測試依賴饺鹃,包括JUnit莫秆、Hamcrest间雀、Mockito以及spring-test模塊。

33)spring-boot-starter-thymeleaf
支持Thymeleaf模板引擎镊屎,包括與Spring的集成惹挟。

34)spring-boot-starter-velocity
支持Velocity模板引擎。

35)spring-boot-starter-web
S支持全棧式Web開發(fā)缝驳,包括Tomcat和spring-webmvc连锯。

36)spring-boot-starter-websocket
支持WebSocket開發(fā)。

37)spring-boot-starter-ws
支持Spring Web Services用狱。

Spring Boot應(yīng)用啟動器面向生產(chǎn)環(huán)境的還有2種运怖,具體如下:

1)spring-boot-starter-actuator
增加了面向產(chǎn)品上線相關(guān)的功能,比如測量和監(jiān)控夏伊。

2)spring-boot-starter-remote-shell
增加了遠程ssh shell的支持摇展。

最后,Spring Boot應(yīng)用啟動器還有一些替換技術(shù)的啟動器溺忧,具體如下:

1)spring-boot-starter-jetty
引入了Jetty HTTP引擎(用于替換Tomcat)咏连。

2)spring-boot-starter-log4j
支持Log4J日志框架。

3)spring-boot-starter-logging
引入了Spring Boot默認的日志框架Logback鲁森。

4)spring-boot-starter-tomcat
引入了Spring Boot默認的HTTP引擎Tomcat祟滴。

5)spring-boot-starter-undertow
引入了Undertow HTTP引擎(用于替換Tomcat)。

自定義SpringBoot-Starter

前言

我們都知道可以使用SpringBoot快速的開發(fā)基于Spring框架的項目刀森。由于圍繞SpringBoot存在很多開箱即用的Starter依賴踱启,使得我們在開發(fā)業(yè)務(wù)代碼時能夠非常方便的报账、不需要過多關(guān)注框架的配置研底,而只需要關(guān)注業(yè)務(wù)即可。

例如我想要在SpringBoot項目中集成Redis透罢,那么我只需要加入spring-data-redis-starter的依賴榜晦,并簡單配置一下連接信息以及Jedis連接池配置就可以。這為我們省去了之前很多的配置操作羽圃。甚至有些功能的開啟只需要在啟動類或配置類上增加一個注解即可完成乾胶。

那么如果我們想要自己實現(xiàn)自己的Starter需要做些什么呢?下面就開始介紹如何實現(xiàn)自己的SpringBoot-xxx-starter朽寞。

原理

首先說說原理识窿,我們知道使用一個公用的starter的時候,只需要將相應(yīng)的依賴添加的Maven的配置文件當中即可脑融,免去了自己需要引用很多依賴類喻频,并且SpringBoot會自動進行類的自動配置。那么 SpringBoot 是如何知道要實例化哪些類肘迎,并進行自動配置的呢甥温? 下面簡單說一下锻煌。

第一步,SpringBoot 在啟動時會去依賴的starter包中尋找 resources/META-INF/spring.factories文件姻蚓,然后根據(jù)文件中配置的Jar包去掃描項目所依賴的Jar包宋梧,這類似于 Java 的 SPI 機制。(spi介紹參閱:Java的spi介紹和簡單應(yīng)用)

第二步狰挡,根據(jù) spring.factories配置加載AutoConfigure類捂龄。

最后,根據(jù) @Conditional注解的條件加叁,進行自動配置并將Bean注入Spring Context 上下文當中跺讯。

我們也可以使用@ImportAutoConfiguration({MyServiceAutoConfiguration.class}) 指定自動配置哪些類。

實現(xiàn)

終于到了代碼實現(xiàn)的步驟殉农,接下來就開始編碼我們自己的SpringBoot-starter刀脏。

第一步創(chuàng)建一個SpringBoot 項目,并添加下面兩個依賴到pom.xml文件當中

<dependencies>    
  <dependency>        
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
  </dependency>    
  <dependency>       
     <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-autoconfigure</artifactId>
  </dependency>
</dependencies>

其中 spring-boot-configuration-processor的作用是編譯時生成 spring-configuration-metadata.json超凳,此文件主要給IDE使用愈污。如當配置此jar相關(guān)配置屬性在 application.yml,你可以用ctlr+鼠標左鍵點擊屬性名轮傍,IDE會跳轉(zhuǎn)到你配置此屬性的類中暂雹。

我們?nèi)粘J褂玫腟pring官方的Starter一般采取spring-boot-starter-{name}的命名方式,如 spring-boot-starter-web创夜。

而非官方的Starter杭跪,官方建議 artifactId 命名應(yīng)遵循{name}-spring-boot-starter的格式。 例如:mybatis-spring-boot-starter 驰吓。

<groupId>com.ysc</groupId>
<artifactId>simple-spring-boot-starter</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>jar</packaging>

第二步編寫我們的Service類

這里講一下我們的Starter要實現(xiàn)的功能涧尿,很簡單,提供一個Service檬贰,包含一個能夠?qū)⑴渲梦募信渲玫淖址鶕?jù)傳入的字符進行分割的方法String[] split(String separatorChar)姑廉。

public class StarterService {
  private String config;    
  public StarterService(String config) { 
       this.config = config;    
  }        
  public String[] split(String separatorChar) { 
       return StringUtils.split(this.config, separatorChar);    
  }    
}

第三步編寫配置文件讀取類

@ConfigurationProperties("example.service")
public class StarterServiceProperties {    
  private String config;        
  public void setConfig(String config) {
        this.config = config;    
  }        
  public String getConfig() {
        return config;    
  } 
}

第四步,編寫AutoConfigure類 翁涤,這步是關(guān)鍵點

  @Configuration@ConditionalOnClass(StarterService.class)
  @EnableConfigurationProperties(StarterServiceProperties.class)
  public class StarterAutoConfigure {
    @Autowired    
    private StarterServiceProperties properties;     
    @Bean    
    @ConditionalOnMissingBean    
    @ConditionalOnProperty(prefix = "example.service", value = "enabled", havingValue = "true")    
    StarterService starterService (){
        return new StarterService(properties.getConfig());    
    }
 }

解釋一下代碼中用到的幾個注解:

   `@ConditionalOnClass`桥言,當`classpath`下發(fā)現(xiàn)該類的情況下進行自動配置。
   `@ConditionalOnMissingBean`葵礼,當`Spring Context`中不存在該`Bean`時号阿。
   `@ConditionalOnProperty(prefix = "example.service",value = "enabled",havingValue = "true")`,
    當配置文件中`example.service.enabled=true`時鸳粉。

下面列舉SpringBoot中的所有@Conditional注解及作用

@ConditionalOnBean:當容器中有指定的Bean的條件下  
@ConditionalOnClass:當類路徑下有指定的類的條件下  
@ConditionalOnExpression:基于SpEL表達式作為判斷條件
 @ConditionalOnJava:基于JVM版本作為判斷條件  
@ConditionalOnJndi:在JNDI存在的條件下查找指定的位置  
@ConditionalOnMissingBean:當容器中沒有指定Bean的情況下  
@ConditionalOnMissingClass:當類路徑下沒有指定的類的條件下  
@ConditionalOnNotWebApplication:當前項目不是Web項目的條件下  
@ConditionalOnProperty:指定的屬性是否有指定的值  
@ConditionalOnResource:類路徑下是否有指定的資源  
@ConditionalOnSingleCandidate:當指定的Bean在容器中只有一個扔涧,或者在有多個Bean的情況下,用來指定首選的Bean
 @ConditionalOnWebApplication:當前項目是Web項目的條件下 

最后一步赁严,在resources/META-INF/下創(chuàng)建spring.factories文件扰柠,并添加如下內(nèi)容:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.example.autocinfigure.StarterAutoConfigure

至此粉铐,我們的一個Starter代碼部分就是完成了,下面將項目安裝到本地Maven倉庫中卤档。

發(fā)布

在項目根目錄執(zhí)行 mvn install 進行打包安裝蝙泼。

測試

將Starter項目的依賴添加到我們自己的SpringBoot項目中

<dependency>    
  <groupId>com.ysc</groupId>    
  <artifactId>simple-spring-boot-starter</artifactId>    
  <version>1.0-SNAPSHOT</version>
 </dependency>

application.yml 配置文件中添加配置信息:

example
  service
    enabled: true
    config: abc-des-dde,SSS-DRS-RE,SDR-SDFR-XXX

在本地使用JUnit進行代碼測試

    @Autowiredprivate StarterService starterService; @Testpublic 
    void starterTest() {    
      String[] splitArray = starterService.split(",");
      System.out.println(splitArray);
    }

好,到這我們的一個自定義starter就完成了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末劝枣,一起剝皮案震驚了整個濱河市汤踏,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌舔腾,老刑警劉巖溪胶,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異稳诚,居然都是意外死亡哗脖,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門扳还,熙熙樓的掌柜王于貴愁眉苦臉地迎上來才避,“玉大人,你說我怎么就攤上這事氨距∩J牛” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵俏让,是天一觀的道長楞遏。 經(jīng)常有香客問我,道長首昔,這世上最難降的妖魔是什么寡喝? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮沙廉,結(jié)果婚禮上拘荡,老公的妹妹穿的比我還像新娘。我一直安慰自己撬陵,他們只是感情好,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布网缝。 她就那樣靜靜地躺著巨税,像睡著了一般。 火紅的嫁衣襯著肌膚如雪粉臊。 梳的紋絲不亂的頭發(fā)上草添,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機與錄音扼仲,去河邊找鬼远寸。 笑死抄淑,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的驰后。 我是一名探鬼主播肆资,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼灶芝!你這毒婦竟也來了郑原?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤夜涕,失蹤者是張志新(化名)和其女友劉穎犯犁,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體女器,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡酸役,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了驾胆。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片簇捍。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖俏拱,靈堂內(nèi)的尸體忽然破棺而出暑塑,到底是詐尸還是另有隱情,我是刑警寧澤锅必,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布事格,位于F島的核電站,受9級特大地震影響搞隐,放射性物質(zhì)發(fā)生泄漏驹愚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一劣纲、第九天 我趴在偏房一處隱蔽的房頂上張望逢捺。 院中可真熱鬧,春花似錦癞季、人聲如沸劫瞳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽志于。三九已至,卻和暖如春废睦,著一層夾襖步出監(jiān)牢的瞬間伺绽,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留奈应,地道東北人澜掩。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像杖挣,于是被迫代替她去往敵國和親肩榕。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344