学习网站:spring boot
Spring Boot的优势
自动配置
根据Classpath中的包自动配置相应的bean.
起步依赖
作用
-
使用场景:
一般我们开发一个web程序,如果想使用Thymeleaf视图、通过JPA进行数据持久化。
为了添加Thymeleaf视图和Jpa的支持,我们不得不添加相关依赖,而添加依赖我们不仅需要知道每个依赖的坐标而且还要保证各依赖之间的兼容。光一个一个找这些依赖就比较麻烦了。而且在还没有代码的情况,我们是不知道添加的依赖到底完不完整的。所以开发一个web程序还没写一行代码之前,光是找各种依赖架包就是一个挺麻烦的事情了。而且,如果我们下次再写一个web程序时,好的情况是直接把上次找好的依赖添加过来,坏的情况是,新写的web需要添加新的依赖,而这个依赖很有可能导致和其它依赖版本不兼容,所以还会产生重新找的问题。 -
起步依赖作用
如果我们在构建文件里指定这些功能:开发Web程序,使用Thymeleaf视图和Jpa的支持。让构建过程自己搞明白我们需要什么东西,岂不是更简单?这正是Spring Boot起步依赖的功能。
指定基于功能的依赖
- Spirng Boot通过提供众多起步依赖降低项目依赖的复杂度。起步依赖本质上是一个Maven项目对象模型(Project Object Model,POM),定义了对其他库的传递依赖,这些东西加在一起即支持某项功能。 很多起步依赖度额命名都暗示了它们提供的某种或某类功能。
比如起步依赖spring-boot-starter-web,他是一个package类型为jar的maven项目,项目里除了一个pom.xml文件外没有任何代码文件。而pom.xml里则声明了对各种web开发可能用到依赖。 - 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来实现数据持久化,因此在构建文件中添加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官方起步依赖的命名规则:spring-boot-starter-*。 *代表具体的模块。比如spring-boot-starter-web。这就是web开发的起步依赖。
spring官网的一些摘要
-
Spring Boot provides a number of “Starters” that make easy to add jars to your classpath.
-
其中spring-boot-starter-parent起步依赖,spring-boot一般都会继承它,它不会往项目中添加任何依赖,它只是提供了一个依赖管理(dependency-management ),这样你就可以不需要为后续的依赖申明版本了。
-
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模板。但是即使经过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:根据maven的就近原则。在当前项目中声明该依赖,则传递过来的依赖就会被取代。
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>填写你想要的版本</veriosn>
</dependency>
命令行界面
Actuator
Spring Boot程序推荐的代码组织结构
Paste_Image.png
构造函数依赖注入
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.
网友评论