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就完成了