1. Spring Boot 简介
Spring Boot
是在Spring
框架基础上设计的一套全新开源框架,其目的是为了简化Spring
应用的搭建和开发过程。Spring Boot
具有以下特点:
- 以
jar
包的形式独立运行,Spring Boot
项目只需通过命令java -jar xx.jar
即可运行。 - 使用嵌入式的
Servlet
容器(例如Tomcat
、Jetty
等),应用无需打成war
包 。 - 提供了一系列的
Starter
来简化Maven
配置。 - 提供了大量的默认自动配置,来简化项目的开发,开发人员只需通过配置文件修改默认配置。
- 对正在运行的项目提供监控。
- 不需要任何
XML
配置即可实现Spring
的所有配置。
原始 Spring 环境搭建和开发存在以下问题:
- 配置繁琐
- 依赖设置繁琐
SpringBoot 程序优点恰巧就是针对 Spring 的缺点
- 自动配置。这个是用来解决 Spring 程序配置繁琐的问题
- 起步依赖。这个是用来解决 Spring 程序依赖设置繁琐的问题
- 辅助功能(内置服务器,…)。我们在启动 SpringBoot 程序时既没有使用本地的 tomcat 也没有使用 tomcat 插件,而是使用 SpringBoot 内置的服务器。
目前最新版本:
项目地址:https://spring.io/projects/spring-boot 。
2. Spring Boot 快速入门
2.1 创建项目
如果 https://start.spring.io 无法连接,切换为 https://start.springboot.io
第一步:创建项目,选择Spring Initalizr
。
第二步:选择Spring Boot
版本和依赖项。
项目结构如下:
2.2 开发控制器
在com.imcode
包下创建子包controller
,
在该包下创建一个名称为HelloBootController
的控制器。
@RestController
public class HelloBootController {
@RequestMapping("/hello")
public String hello() {
return "Hello Boot";
}
}
2.3 启动项目
@SpringBootApplication
public class IBootApplication {
public static void main(String[] args) {
SpringApplication.run(IBootApplication.class, args);
}
}
默认情况下,Spring Boot
项目会创建一个名为***Application
的主程序启动类 ,该类中使用了一个组合注解@SpringBootApplication
,用来开启Spring Boot
的自动配置,另外该启动类中包含一个main()
方法,用来启动该项目。
直接运行启动类BootHelloApplication
中的main()
方法,便可以启动项目,结果如下图:
Spring Boot 内部集成了 Tomcat,不需要人为手动配置 Tomcat,开发者只需要关注具体的业务逻辑即可。
访问 http://localhost:8080/hello
2.4 项目打包和部署
3. 起步依赖
我们使用 Spring Initializr 方式创建的 Maven 工程的的 pom.xml 配置文件中自动生成了很多包含 starter 的依赖,如下图:
3.1 父工程
从上面的文件中可以看到指定了一个父工程,我们进入到父工程,发现父工程中又指定了一个父工程,如下图所示:
再进入到该父工程中,在该工程中我们可以看到配置内容结构如下图所示:
上图中的 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 标签中也对插件的版本进行了锁定,如下图:
看完了父工程中 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 配置: