學習網(wǎng)站:spring boot
Spring Boot的優(yōu)勢
自動配置
根據(jù)Classpath中的包自動配置相應的bean.
起步依賴
作用
-
使用場景:
一般我們開發(fā)一個web程序亭引,如果想使用Thymeleaf視圖兔魂、通過JPA進行數(shù)據(jù)持久化。
為了添加Thymeleaf視圖和Jpa的支持,我們不得不添加相關依賴,而添加依賴我們不僅需要知道每個依賴的坐標而且還要保證各依賴之間的兼容。光一個一個找這些依賴就比較麻煩了啊送。而且在還沒有代碼的情況,我們是不知道添加的依賴到底完不完整的欣孤。所以開發(fā)一個web程序還沒寫一行代碼之前馋没,光是找各種依賴架包就是一個挺麻煩的事情了。而且降传,如果我們下次再寫一個web程序時篷朵,好的情況是直接把上次找好的依賴添加過來,壞的情況是婆排,新寫的web需要添加新的依賴声旺,而這個依賴很有可能導致和其它依賴版本不兼容,所以還會產(chǎn)生重新找的問題段只。 -
起步依賴作用
如果我們在構建文件里指定這些功能:開發(fā)Web程序腮猖,使用Thymeleaf視圖和Jpa的支持。讓構建過程自己搞明白我們需要什么東西赞枕,豈不是更簡單澈缺?這正是Spring Boot起步依賴的功能。
指定基于功能的依賴
- Spirng Boot通過提供眾多起步依賴降低項目依賴的復雜度炕婶。起步依賴本質(zhì)上是一個Maven項目對象模型(Project Object Model姐赡,POM),定義了對其他庫的傳遞依賴柠掂,這些東西加在一起即支持某項功能项滑。 很多起步依賴度額命名都暗示了它們提供的某種或某類功能。
比如起步依賴spring-boot-starter-web陪踩,他是一個package類型為jar的maven項目杖们,項目里除了一個pom.xml文件外沒有任何代碼文件悉抵。而pom.xml里則聲明了對各種web開發(fā)可能用到依賴。 - spring-boot-starter-web起步依賴的pom.xml中依賴的聲明:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>
</dependencies>
- 由此可見摘完,起步依賴是服務于某一類功能的一些依賴的集合姥饰,當在項目中聲明起步依賴時,通過依賴傳遞孝治,就相當于聲明了其它依賴列粪。再簡單點:spring把大部分依賴按照功能進行分類,然后通過起步依賴來管理每一類谈飒。每一個起步依賴都代表一類依賴岂座。
- 舉例
- 你打算做一個閱讀列表Web應用程序。與其向項目的構建文件中添加一堆單獨庫依賴杭措,還不如聲明這是一個Web應用程序來的簡單费什。你只要添加Spring Boot的Web起步依賴就好了。
- 想以Thymeleaf為Web視圖手素,用JPA來實現(xiàn)數(shù)據(jù)持久化鸳址,因此在構建文件中添加Thymeleaf和Spring Data JPA的起步依賴。為了進行測試泉懦,還需要能在Spring Boot上下文里運行集成測試的庫稿黍,因此添加test起步依賴。
最終添加的依賴如下:
...
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
...
這4個起步依賴的具體程度恰到好處崩哩,我們并沒有說想要SpringMVC,只是想說要構建一個Web應用程序巡球。并沒有說指定JUnit或其他測試工具,只是所想要測試自己的代碼邓嘹。Thymeleaf和Spring Data JPA的起步依賴稍微具體一點酣栈。
如果你想知道自己聲明了那些依賴,通過maven構建的項目吴超,可以使用mvn dependency:tree命令來查看依賴樹钉嘹。
起步依賴沒有指定版本號,因為起步依賴本身是由正在使用的spring-boot-starter-parent的版本來決定的鲸阻,而起步依賴的版本則決定它們引入的傳遞依賴的版本。
當前spring-boot項目-->spring-boot-starter-parent-->spring-boot-dependencies缨睡。而在spring-boot-dependencies中的依賴管理中申明了所有起步依賴鸟悴。所以說起步依賴本身的版本有正在使用的spring-boot-starter-parent的版本決定。
spring boot官方起步依賴的命名規(guī)則:spring-boot-starter-*奖年。 *代表具體的模塊细诸。比如spring-boot-starter-web。這就是web開發(fā)的起步依賴陋守。
spring官網(wǎng)的一些摘要
Spring Boot provides a number of “Starters” that make easy to add jars to your classpath.
其中spring-boot-starter-parent起步依賴震贵,spring-boot一般都會繼承它利赋,它不會往項目中添加任何依賴,它只是提供了一個依賴管理(dependency-management )猩系,這樣你就可以不需要為后續(xù)的依賴申明版本了媚送。
Maven users can inherit from the spring-boot-starter-parent project to obtain sensible defaults. The parent project provides the following features:
Java 1.6 as the default compiler level.
UTF-8 source encoding.
A Dependency Management section, allowing you to omit <version> tags for common dependencies, inherited from the spring-boot-dependencies POM.
Sensible resource filtering.
Sensible plugin configuration (exec plugin, surefire, Git commit ID, shade).
Sensible resource filtering for application.properties and application.yml including profile-specific files (e.g. application-foo.properties and application-foo.yml)
spring-boot-starter-parent繼承了spring-boot-dependencies
覆蓋起步依賴引入的傳遞依賴
大部分情況下,你都無需關心每個spring boot起步依賴分別聲明了些什么東西寇甸。Web起步依賴讓你構建Web應用程序塘偎,Thymeleaf起步依賴讓你用Thymeleaf模板。但是即使經(jīng)過Spring Boot團隊的測試拿霉,起步依賴里所選的依賴仍有問題怎么辦吟秩,如何覆蓋起步依賴呢?
覆蓋起步依賴中通過傳遞依賴加入的依賴有兩種原因:1.起步依賴中聲明的依賴我用不到绽淘,為了給程序瘦身涵防,在打包的時候我想把沒用的依賴都排除掉,比如web起步依賴中聲明了jackson依賴沪铭,但是這個依賴我在程序中用不到壮池。2.起步依賴中聲明的依賴版本不滿足要求。
針對第1種情況伦意,如果使用maven構建項目火窒,則使用exclusions標簽來排除。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>com.fasterxml.jackson.core</groupId>
</exclusion>
</exclusions>
</dependency>
- 針對第2中情況:有兩種辦法
1:因為所有起步依賴涉及的依賴的版本都在 spring-boot-dependencies
中聲明了驮肉,所以可以在當前項目的pom.xml中覆蓋之前屬性熏矿。比如
<properties>
<spring-data-releasetrain.version>Fowler-SR2</spring-data-releasetrain.version>
</properties>
在做這個之前你需要知道你要修改的依賴的版本屬性在spring-boot-dependencies中的名稱。spring-boot-dependencies ->pom 离钝。遺憾的是票编,不是每一個依賴的版本在dependencies 都有聲明,像web起步依賴中的jackson依賴在dependencies 中就沒有關于依賴版本屬性的聲明卵渴,那么它的版本在哪里呢慧域?答:該依賴是dependencies 中聲明的某個依賴傳遞過來的。面對這種情況只能采用第二種辦法浪读。
2:根據(jù)maven的就近原則昔榴。在當前項目中聲明該依賴,則傳遞過來的依賴就會被取代碘橘。
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>填寫你想要的版本</veriosn>
</dependency>
命令行界面
Actuator
Spring Boot程序推薦的代碼組織結構
構造函數(shù)依賴注入
package com.example.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class DatabaseAccountService implements AccountService {
private final RiskAssessor riskAssessor;
@Autowired
public DatabaseAccountService(RiskAssessor riskAssessor) {
this.riskAssessor = riskAssessor;
}
// ...
}
Notice how using constructor injection allows the riskAssessor field to be marked as final, indicating that it cannot be subsequently changed.