1. Spring Boot 简介

Spring Boot是在Spring框架基础上设计的一套全新开源框架,其目的是为了简化Spring应用的搭建和开发过程。
Spring Boot具有以下特点:

  • jar包的形式独立运行,Spring Boot项目只需通过命令java -jar xx.jar 即可运行。
  • 使用嵌入式的Servlet容器(例如TomcatJetty等),应用无需打成war包 。
  • 提供了一系列的Starter来简化Maven配置。
  • 提供了大量的默认自动配置,来简化项目的开发,开发人员只需通过配置文件修改默认配置。
  • 对正在运行的项目提供监控。
  • 不需要任何XML配置即可实现Spring的所有配置。

原始 Spring 环境搭建和开发存在以下问题:

  • 配置繁琐
  • 依赖设置繁琐

SpringBoot 程序优点恰巧就是针对 Spring 的缺点

  • 自动配置。这个是用来解决 Spring 程序配置繁琐的问题
  • 起步依赖。这个是用来解决 Spring 程序依赖设置繁琐的问题
  • 辅助功能(内置服务器,…)。我们在启动 SpringBoot 程序时既没有使用本地的 tomcat 也没有使用 tomcat 插件,而是使用 SpringBoot 内置的服务器。

目前最新版本:
image.pngimage.png
项目地址:https://spring.io/projects/spring-boot

2. Spring Boot 快速入门

2.1 创建项目

如果 https://start.spring.io 无法连接,切换为 https://start.springboot.io
第一步:创建项目,选择Spring Initalizr
image.png
第二步:选择Spring Boot版本和依赖项。
image.png
项目结构如下:
image.png

2.2 开发控制器

com.imcode包下创建子包controller
在该包下创建一个名称为HelloBootController的控制器。

  1. @RestController
  2. public class HelloBootController {
  3. @RequestMapping("/hello")
  4. public String hello() {
  5. return "Hello Boot";
  6. }
  7. }

2.3 启动项目

image.png

@SpringBootApplication
public class IBootApplication {
    public static void main(String[] args) {
        SpringApplication.run(IBootApplication.class, args);
    }           
}

默认情况下,Spring Boot项目会创建一个名为***Application的主程序启动类 ,该类中使用了一个组合注解@SpringBootApplication,用来开启Spring Boot的自动配置,另外该启动类中包含一个main()方法,用来启动该项目。
直接运行启动类BootHelloApplication中的main()方法,便可以启动项目,结果如下图:
image.png

Spring Boot 内部集成了 Tomcat,不需要人为手动配置 Tomcat,开发者只需要关注具体的业务逻辑即可。

访问 http://localhost:8080/hello
image.png

2.4 项目打包和部署

3. 起步依赖

我们使用 Spring Initializr 方式创建的 Maven 工程的的 pom.xml 配置文件中自动生成了很多包含 starter 的依赖,如下图:
image.png

3.1 父工程

image.png
从上面的文件中可以看到指定了一个父工程,我们进入到父工程,发现父工程中又指定了一个父工程,如下图所示:
image.png
再进入到该父工程中,在该工程中我们可以看到配置内容结构如下图所示:
image.png
上图中的 properties 标签中定义了各个技术软件依赖的版本,避免了我们在使用不同软件技术时考虑版本的兼容问题。在 properties 中我们找 servlet 和 mysql 的版本如下:

<mysql.version>8.0.29</mysql.version>
<servlet-api.version>4.0.1</servlet-api.version>

dependencyManagement 标签是进行依赖版本锁定,但是并没有导入对应的依赖;如果我们工程需要那个依赖只需要引入依赖的 groupid 和 artifactId 不需要定义 version。
而 build 标签中也对插件的版本进行了锁定,如下图:
image.png
看完了父工程中 pom.xml 的配置后不难理解我们工程的的依赖为什么都没有配置 version。
相关依赖。

3.2 相关依赖

在我们创建的工程中的 pom.xml 中配置了如下依赖:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>

进入到该依赖,查看 pom.xml 的依赖会发现它引入了如下的依赖:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter</artifactId>
  <version>2.7.1</version>
  <scope>compile</scope>
</dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-json</artifactId>
  <version>2.7.1</version>
  <scope>compile</scope>
</dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-tomcat</artifactId>
  <version>2.7.1</version>
  <scope>compile</scope>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-web</artifactId>
  <version>5.3.21</version>
  <scope>compile</scope>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-webmvc</artifactId>
  <version>5.3.21</version>
  <scope>compile</scope>
</dependency>

里面的引入了 spring-web 和 spring-webmvc 的依赖,这就是为什么我们的工程中没有依赖这两个包还能正常使用 springMVC 中的注解的原因。
而依赖 spring-boot-starter-tomcat ,从名字基本能确认内部依赖了 tomcat,所以我们的工程才能正常启动。

3.3 总结

starter

  • SpringBoot 中常见项目名称,定义了当前项目使用的所有项目坐标,以达到减少依赖配置的目的

parent

  • 所有 SpringBoot 项目要继承的项目,定义了若干个坐标版本号(依赖管理,而非依赖),以达到减少依赖冲突的目的
  • spring-boot-starter-parent(2.5.0)与 spring-boot-starter-parent(2.4.6)共计57处坐标版本不同

实际开发

  • 使用任意坐标时,仅指定 groupid 和 artifactId
  • 如发生坐标错误,再指定 version(要注意版本冲突)

4. 程序启动

@SpringBootApplication
public class Springboot01QuickstartApplication {
    public static void main(String[] args) {
        SpringApplication.run(Springboot01QuickstartApplication.class, args);
    }
}
  • SpringBoot 在创建项目时,采用jar的打包方式
  • SpringBoot 的引导类是项目的入口,运行 main 方法就可以启动项目。因为我们在 pom.xml 中配置了 spring-boot-starter-web 依赖,而该依赖通过前面的学习知道它依赖 tomcat ,所以运行 main 方法就可以使用 tomcat 启动咱们的工程。

5. 引入 Spring Boot 的两种方式

Maven的继承是单继承,如何在已经有父项目的项目中引入Spring Boot呢?以下两种方式等效:
继承:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-dependencies</artifactId>
    <version>2.7.1</version>
 </parent>

导入:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>2.7.1</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

6. spring-boot-devtools

SpringBoot 项目中添加 spring-boot-devtools 依赖即可实现页面和代码的热加载:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-devtools</artifactId>
  <optional>true</optional>
</dependency>

IDEA 配置:
image.png