SpringBoot提供了針對日常企業應用研發各種場景的spring-boot-starter自動配置 依賴模塊,如此多“開箱即用”的依賴模塊,使得開發各種場景的Spring應用 更加快速和高效,本文會就幾個常見的通用spring-boot-starter模塊進行了解
一、約定優先于配置
所有的spring-boot-starter都有約定俗成的默認配置,但允許我們調整這些配置以改變默認的配置行為,即“約定優先于配置”。
簡單來講,我們可以將對SpringBoot的行為可以進行干預的配置方式劃分 為幾類:
- 命令行參數(Command Line Args)
- 系統環境變量(Environment Variables)
- 位于文件系統中的配置文件。
- 位于classpath中的配置文件。
- 固化到代碼中的配置項。
以上幾種方式按照優先級從高到低排列,高優先級方式提供的配置項可以覆蓋或者 優先生效
不管是位于文件系統還是classpath, SpringBoot應用默認的配置文件名叫 作application.properties,可以直接放在當前項目的根目錄下或者名稱為config 的子目錄下
二、應用日志和 spring-boot-starter-logging
Java的日志系統多種多樣,從java.util默認提供的日志支持,到log4j、 Iog4j2、commons logging等,復雜繁多,所以,應用日志系統的配置就會比較特殊,從而spring-boot-starter-logging也比較特殊一些
假如 maven 依賴中添加了 spring-boot-starter-logging:
<dependency><groupId>org.spring.framework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId>
</dependency>
那么,我們的SpringBoot應用將自動使用logback作為應用日志框架, SpringBoot 啟 動的時候,由 org.sprmgframework.boot.logging.Logging-Application- Listener根據情況初始化并使用。
SpringBoot為我們提供了很多默認的日志配置,所以,只要將spring-boot- starter-logging 作為依賴加入到當前應用的classpath,則"開箱即用”,不需要 做任何多余的配置,但假設我們要對默認SpringBoot提供的應用日志設定做調 整,則可以通過幾種方式進行配置調整:
-
遵循logback的約定,在classpath中使用自己定制的logback.xml配置文件。
-
在文件系統中任何一個位置提供自己的logback.xml配置文件,然后通過logging.config配置項指向這個配置文件來啟用它,比如在 application.properties中指定如下的配置。
logging.config=/(some.path.you.defined}/any-logfile-name-1-like.log
SpringBoot默認允許我們通過在配置文件或者命令行等方式使用 logging.file和logging.path來自定義日志文件的名稱和存放路徑,不過, 這只是允許我們在SpringBoot框架預先定義的默認日志系統設定的基 礎上做有限的設置,如果我們希望更靈活的配置,最好通過框架特定的 配置方式提供相應的配置文件,然后通過logging.config來啟用
如果使用log4j或者Iog4j2,那么也可以釆用類似的方式將它們對應的spring-boot-starter依賴模塊加到Maven依賴中即可:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-log4j </artifactId>
</dependency>
或者
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-log4j2 </artifactId>
</dependency>
但一定不要將這些完成同一目的的spring-boot-starter都加到依賴中
三、快速Web應用開發與 spring-boot-starter-web
在這個互聯網時代,使用Spring框架除了開發少數的獨立應用,大部分 情況下實際上在使用SpringMVC開發web應用,為了幫我們簡化快速搭建并 開發一個Web項目,SpringBoot為我們提供了 spring-boot-starter-web自動配 置模塊。
只要將spring-boot-starter-web加入項目的maven依賴:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
我們就得到了一個直接可執行的Web應用,當前項目下運行mvn spring-boot:run就可以直接啟動一個使用了嵌入式tomcat服務請求的Web 應用,只不過,我們還沒有提供任何服務Web請求的Controller
接下來我們可以在當前項目下新建一個服務根路徑Web請 求的Controller實現:
@RestController
public class Indexcontroller{@RequestMapping("/")public String index(){return "hello, there";}
}
運行 mvn spring-boot:run 并訪問 http://localhost:8080,我們的Controller返回消息,一個簡單的Web應用就這樣完成了。
但是,簡單的背后,其實卻有很多“潛規則”(約定),我們只有充分了解 了這些"潛規則”,才能更好地應用spring-boot-starter-web
1、項目結構層面的約定
項目結構層面與傳統打包為war的Java Web應用的差異在于,靜態文件和 頁面模板的存放位置變了,原來是放在src/main/webapp目錄下的一系列資源, 現在都統一放在src/main/resources相應子目錄下,比如:
- src/main/resources/static用于存放各類靜態資源,比如css, js等。
- src/main/resources/templates 用于存放模板文件,比如 *.vm。
2、 SpringMVC框架層面的約定和定制
spring-boot-starter-web默認將為我們自動配置如下一些SpringMVC必要組件:
- 必要的 ViewResolver,比如 ContentNegotiatingViewResolver 和 Bean- NameViewResolvero
- 將必要的 Converter、GenericConverter 和 Formatter 等 bean 注冊到 IoC 容器。
- 添加一系列的HttpMessageConverter以便支持對Web請求和相應的類型 轉換。
- 自動配置和注冊 MessageCodesResolvero
- 其他
任何時候,如果我們對默認提供的SpringMVC組件設定不滿意,都可 以在IoC容器中注冊新的同類型的bean定義來替換,或者直接提供一個基于 WebMvcConfigurerAdapter類型的bean定義來定制,甚至直接提供一個標注了 @EnableWebMvc的?Configuration配置類完全接管所有SpringMVC的相關配 置,自己完全重新配置。
3、嵌入式Web容器層面的約定和定制
spring-boot-starter-web默認使用嵌入式tomcat作為web容器對外提供 HTTP服務,默認將使用8080端口對外監聽和提供服務:
假設我們不想使用默認的嵌入式tomcat ( spring-boot-starter-tomcat自動配置模塊),那么可以引入 spring-boot-starter-jetty 或者 spring-boot-starter- undertow 作為替代方案。
假設我們不想使用默認的8080端口,那么我們可以通過更改配置項 server.port使用自己指定的端口,比如:server.port=9000
spring-boot-starter-web提供了很多以server.為前綴的配置項用于對嵌入式 Web容器提供配置,比如:
- server.port
- server, address
- server, ssl.*
- server, tomcat.*
此外SpringBoot甚至允許我們直接對嵌入式的 Web容器實例進行定制,但這里不過多贅述了
四、數據訪問與 spring-boot-starter-jdbc
大部分Java應用都需要訪問數據庫,尤其是服務層,所以,SpringBoot會為我們自動配置相應的數據訪問設施。
想SpringBoot為我們自動配置數據訪問的基礎設施,那么,我們需要 直接或者間接地依賴spring-jdbc, 一旦spring-jdbc位于我們SpringBoot應用 的classpath,即會觸發數據訪問相關的自動配置行為,最簡單的做法就是把 spring-boot-starter-jdbc 加為應用的依賴。
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
默認情況下,如果我們沒有配置任何DataSource,那么,SpringBoot會 為我們自動配置一個基于嵌入式數據庫的DataSource,這種自動配置行為其 實很適合于測試場景,但對實際的開發幫助不大,基本上我們會自己配置一個 DataSource實例
假設我們的SpringBoot應用只依賴一個數據庫,那么,使用DataSource 自動配置模塊提供的配置參數是最方便的:
spring.datasource.url=jdbc:mysql://(database host):3306/(databaseName)
spring.datasource.username=(database username}
spring.datasource.password={database password}
當然,自己配置一個DataSource也是可以的,SpringBoot也會智能地選擇 我們自己配置的這個DataSource實例
另外,SpringBoot還提供了很多其他數據訪問相關的自動配置模塊,比如 spring-boot-starter-data-jpa
`spring-boot-starter-data-mongodb `等,大家可以根據 自己數據訪問的具體場景選擇使用這些自動配置模塊。
五、常見spring-boot-starter模塊及功能
spring-boot-starter
這是Spring Boot的核心啟動器,包含了自動配置、日志和YAML。
spring-boot-starter-amqp
通過spring-rabbit來支持AMQP協議(Advanced Message Queuing Protocol.)。
spring-boot-starter-aop
支持面向方面的編程即AOP,包括spring-aop和AspectJ。
spring-boot-starter-artemis
通過Apache Artemis支持JMS的API(Java Message Service API. 。
spring-boot-starter-batch
支持Spring Batch,包括HSQLDB數據庫。
spring-boot-starter-cache
支持Spring的Cache抽象。
spring-boot-starter-cloud-connectors
支持Spring Cloud Connectors,簡化了在像Cloud Foundry或Heroku這樣的云平臺上連接服務。
spring-boot-starter-data-elasticsearch
支持ElasticSearch搜索和分析引擎,包括spring-data-elasticsearch。
spring-boot-starter-data-gemfire
支持GemFire分布式數據存儲,包括spring-data-gemfire。
spring-boot-starter-data-jpa
支持JPA(Java Persistence API. ,包括spring-data-jpa、spring-orm、Hibernate)。
spring-boot-starter-data-mongodb
支持MongoDB數據,包括spring-data-mongodb。
spring-boot-starter-data-rest
通過spring-data-rest-webmvc,支持通過REST暴露Spring Data數據倉庫。
spring-boot-starter-data-solr
支持Apache Solr搜索平臺,包括spring-data-solr。
spring-boot-starter-freemarker
支持FreeMarker模板引擎。
spring-boot-starter-groovy-templates
支持Groovy模板引擎。
spring-boot-starter-hateoas
通過spring-hateoas支持基于HATEOAS的RESTful Web服務。
spring-boot-starter-hornetq
通過HornetQ支持JMS。
spring-boot-starter-integration
支持通用的spring-integration模塊。
spring-boot-starter-jdbc
支持JDBC數據庫。
spring-boot-starter-jersey
支持Jersey RESTful Web服務框架。
spring-boot-starter-jta-atomikos
通過Atomikos支持JTA分布式事務處理。
spring-boot-starter-jta-bitronix
通過Bitronix支持JTA分布式事務處理。
spring-boot-starter-mail
支持javax.mail模塊。
spring-boot-starter-mobile
支持spring-mobile。
spring-boot-starter-mustache
支持Mustache模板引擎。
spring-boot-starter-redis
支持Redis鍵值存儲數據庫,包括spring-redis。
spring-boot-starter-security
支持spring-security。基本的認證和授權功能,提供了加密解密、統一登錄等一系列相關支持
spring-boot-starter-social-facebook
支持spring-social-facebook
spring-boot-starter-social-linkedin
支持pring-social-linkedin
spring-boot-starter-social-twitter
支持pring-social-twitter
spring-boot-starter-test
支持常規的測試依賴,包括JUnit、Hamcrest、Mockito以及spring-test模塊。
spring-boot-starter-thymeleaf
支持Thymeleaf模板引擎,包括與Spring的集成。
spring-boot-starter-velocity
支持Velocity模板引擎。
spring-boot-starter-web
S支持全棧式Web開發,包括Tomcat和spring-webmvc。
spring-boot-starter-websocket
支持WebSocket開發。
spring-boot-starter-ws
支持Spring Web Services。
Spring Boot應用啟動器面向生產環境的還有2種,具體如下:
spring-boot-starter-actuator
增加了面向產品上線相關的功能,比如測量和監控。
spring-boot-starter-remote-shell
增加了遠程ssh shell的支持。
最后,Spring Boot應用啟動器還有一些替換技術的啟動器,具體如下:
spring-boot-starter-jetty
引入了Jetty HTTP引擎(用于替換Tomcat. 。
spring-boot-starter-log4j
支持Log4J日志框架。
spring-boot-starter-logging
引入了Spring Boot默認的日志框架Logback。
spring-boot-starter-tomcat
引入了Spring Boot默認的HTTP引擎Tomcat。
spring-boot-starter-undertow
引入了Undertow HTTP引擎(用于替換Tomcat.
參考:
- 《SpringBoot揭秘+快速構建微服務體系》 第四章
- SpringBoot 之Spring Boot Starter依賴包及作用