SpringBoot基础篇

129 阅读5分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第7天,点击查看活动详情


⭐️前面的话⭐️

✉️坚持和努力一定能换来诗与远方!
💭推荐书籍:📚《王道408》,📚《深入理解 Java 虚拟机-周志明》,📚《Java 核心技术卷》
💬算法刷题:✅力扣🌐牛客网
🎈Github
🎈码云Gitee


1 SpringBoot应用四种创建方式

1.1 基于IDEA

①:创建新模块,选择Spring Initializr,并配置模块相关基础信息

②:选择当前模块需要使用的技术集

③:开发控制器类

//Rest模式
@RestController
@RequestMapping("/books")
public class BookController {
    @GetMapping
    public String getById(){
        System.out.println("springboot is running...");
        return "springboot is running..."; 
    } 
}

④:运行自动生成的Application类

# 最简SpringBoot程序所包含的基础文件:
- pom.xml文件
- Application类

Spring 程序与SpringBoot 程序对比:

1.2 基于官网:start.spring.io/

  • 打开SpringBoot官网,选择Quickstart Your Project
  • 创建工程,并保存项目
  • 解压项目,通过IDE导入项目

1.3 基于阿里云:start.aliyun.com

  • 阿里云提供的坐标版本较低,如果需要使用高版本,进入工程后手工切换SpringBoot版本
  • 阿里云提供的工程模板与Spring官网提供的工程模板略有不同

1.4 手工创建Maven工程修改为SpringBoot工程(推荐)

  • 创建普通 Maven 工程
  • 继承 spring-boot-starter-parent
  • 添加依赖 spring-boot-starter-web
  • 制作引导类 Application

2 初步解析

  • parent
  • stater
  • 引导类
  • 内嵌Tomcat

2.1 parent

  • 1、开发 SpringBoot程序要继承 spring-boot-starter-parent,各版本间存在着诸多坐标版本不同。
  • 2、spring-boot-starter-parent中定义了若干个依赖管理(依赖管理,而非依赖)。
  • 3、继承parent模块可以避免多个依赖使用相同技术时出现依赖版本冲突。
  • 4、继承parent的形式也可以采用引入依赖的形式实现效果。
    • 方式1:继承spring-boot-starter-parent
    • 方式2:使用 dependencyManagement 依赖 spring-boot-dependencies
<!-- 如下两种方式效果相同 -->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.5.4</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<!-- 因为继承只能一次,采用如下方式2同时可继承其它父模块 -->
<dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-dependencies</artifactId>
        <version>${spring-boot.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
</dependencyManagement>

2.2 stater

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

# parent 和 stater 主要解决配置问题!!!

# 实际开发
使用任意坐标时,仅书写 GAV中的G和A,V由SpringBoot提供,除非SpringBoot未提供对应版本V。
如发生坐标错误,再指定 Version(要小心版本冲突)。

# starter
1. 开发 SpringBoot 程序需要导入坐标时通常导入对应的 starter;
2. 每个不同的 starter 根据功能不同,通常包含多个依赖坐标;
3. 使用 starter 可以实现快速配置的效果,达到简化配置的目的。

2.3 引导类

// SpringBoot的引导类是Boot工程的执行入口,运行main方法就可以启动项目。
// SpringBoot工程运行后初始化 Spring容器,扫描引导类所在包加载 bean。
@SpringBootApplication
public class Springboot01QuickstartApplication {
    public static void main(String[] args) {
        SpringApplication.run(Springboot01QuickstartApplication.class, args);
    } 
}

2.4 内嵌Tomcat

2.4.1 Jetty

  • 使用maven依赖管理变更起步依赖项

  • Jetty 比 Tomcat 更轻量级,可扩展性更强(相较于 Tomcat),谷歌应用引擎(GAE)已经全面切换为 Jetty。
    • tomcat(默认):apache出品,粉丝多,应用面广,负载了若干较重的组件
    • jetty:更轻量级,负载性能远不及tomcat
    • undertow:undertow,负载性能勉强跑赢tomcat
  • 总结
    • 内嵌Tomcat服务器是SpringBoot辅助功能之一。
    • 内嵌Tomcat工作原理是将Tomcat服务器作为对象运行,并将该对象交给Spring容器管理。
    • 变更内嵌服务器思想是去除现有服务器,添加全新的服务器。

3 基础配置

yml 配置文件

4 整合第三方技术

4.1 整合swagger

swagger2

  • 添加依赖
<!--包含:springfox-swagger-ui、springfox-swagger2等-->
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-boot-starter</artifactId>
    <version>3.0.0</version>
</dependency>
  • 引入配置
    • 添加注解,开启Swagger的功能:@EnableSwagger2
    • 定义配置类
  • 添加相应注解
  • 一个问题:SpringBoot2.6版本和Swagger2.9.2不兼容导致的。 也有人说是由于guava这个包的版本过低导致的。
    • 解决:配置文件中添加配置
# SpringBoot 2.6.X使用PathPatternMatcher匹配路径,Swagger引用的Springfox使用的路径匹配是基于AntPathMatcher的。
spring.mvc.pathmatch.matching-strategy=ANT_PATH_MATCHER

swagger3

  • 添加依赖
<!--包含:springfox-swagger-ui、springfox-swagger2等-->
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-boot-starter</artifactId>
    <version>3.0.0</version>
</dependency>
  • 引入配置
    • 添加注解:@EnableOpenApi
    • 定义配置类

4.2 常用注解

  • @Api 标识一个java类是文档类,用 controller 类的类名上;
    • value:字符串,对controller类的作用描述,代替原来的description(已过时),一般用此属性;
    • tags:字符串数组,标签组,同样可以描述controller的作用;
  • @ApiModel 标识一个实体类,用在类名上;
    • value:字符串,模型的简短别名,使得在文档的导航中便于识别;
    • description:字符串,模型的附加描述;
  • @ApiModelProperty 作用在类属性上,添加属性描述;
    • value:字符串,字段描述;
    • required:boolean;指定参数是否必须,默认false;
    • example:字符串,参数值的示例
  • @ApiOperation 作用在接口类的方法上,控制方法的相关描述;
    • value:字符串,方法的功能描述;
    • tags:字符串数组,标签组,同样可以描述方法的作用;
    • response:ClassType,显示指出返回的对象类型;在响应示例中会显示出改对象的字段以及示例、描述;
    • code:响应代码,默认200,一般不改;
  • @ApiImplicitParam 作用在接口方法上,描述单个参数信息,只能作用在方法上;
    • name:字符串,参数名;
    • value:字符串,参数描述;
    • defaultValue:字符串,参数默认值;
    • required:boolean,标识是否必须传值,默认false;
    • dataType:字符串,参数类型,可以是某个类名,也可以是基本数据类型的引用类名,如Integer;
    • example:字符串,参数值示例;
  • @ApiImplicitParams 作用在接口方法上,@ApiImplicitParam 参数数组;
    • value:@ApiImplicitParam类型数组,当方法有多个@ApiImplicitParam参数时,需要放到@ApiImplicitParams注解中
  • @ApiParam 作用在接口方法上,描述单个参数信息,属性基本与 @ApiImplicitParam 一样,但可以作用在方法、参数、属性上;
    • name:字符串,参数名;
    • value:字符串,参数描述;
    • defaultValue:字符串,设置默认值;
    • required:boolean,是否必须,默认false;
    • example:字符串,参数值示例;