SpringBoot基础及概念入门


SpringBoot 基础及概念入门

1. SpringBoot 产⽣的背景及其优势

⼀、内容⼤纲

  • SpringBoot 诞⽣的背景
  • SpringBoot 改变了什么
  • SpringBoot 主要特性
  • SpringBoot 集成第三⽅开源组件的步骤

⼆、SpringBoot 诞⽣的背景

在 SpringBoot 出现以前,使⽤ Spring 框架的程序员是这样配置 Web 应⽤环境的,需要⼤量的 xml 配置。

随着 Web 项⽬集成软件的不断增多,xml 配置也不断增多,xml 配置⽂件也在不断地增多,项⽬的依赖管理也越发的复杂。Spring 框架也因此饱受争议,配置⽂件难以理解且容易出错。——配置地狱

xml 配置⽂件不但复杂,⽽且绝⼤部分属于模板配置,也就是说有 80%以上的配置是不断重复的。

因此,像 JFinal 这种轻量级的 web 开发框架,因为其简单易⽤的特性,逐渐有了很⼤发展的空间。 Spring 社区也逐渐意识到了这个问题,在 2013 年的 SpringOne 2GX 会议上,Pivotal 的 CTO Adrian Colyer 回应了关于 Spring 框架使⽤复杂度的问题,并且特别提到该平台将来的⽬标之⼀就是实现免 XML 配置和提供更佳的开发体验,也就是我们今天使⽤的 SpringBoot 诞⽣的主要原因。

Spring 开源社区背后有强⼤的商业公司⽀持,⽀持⼒度⽐较⼤的公司如 Pivotal 、Netflix 以及中国的阿⾥巴巴。

三、SpringBoot 改变了什么

举⼀个例⼦:⾃⼰接电线与标准化插座

SpringBoot 的配置⽅式,就像是插头插座的国家标准,第三⽅开源类库要想接⼊进来,就要按照这个标准做⼀个 starter 的适配。

SpringBoot 虽然灵活性不如 Spring MVC 的⽅式,并且你也不太清楚插座⾥⾯的线路是什么样,但就是⽅便易⽤。话说回来,当你习惯使⽤了买现成的插头插座,你还会希望⾃⼰动⼿当电⼯么?

百度指数对比

SpringBoot 的⽬标不在于为已解决的问题领域提供新的解决⽅案,⽽是为平台带来另⼀种新的开发体验,从⽽简化对这些已有技术的使⽤。

  • 使配置变简单
  • 使开发变简单
  • 使监控变简单
  • 使部署变简单

四、SpringBoot 主要特性

  • 遵循“约定优于配置”的原则,简化配置
  • 可以完全脱离 XML 配置⽂件,采⽤注解配置和 Java Config
  • 内嵌 Servlet 容器,应⽤可⽤ jar 包执⾏:java -jar ****.jar 即可启动应⽤
  • 快速完成项⽬搭建、整合第三⽅类库,⽅便易⽤
  • 提供了 starter POM, 能够⾮常⽅便地进⾏包管理, 简化包管理配置
  • 与 Spring Cloud 天然集成,Spring Boot 是⽬前 Java 体系内微服务的最佳实现⽅案

五、关于 spring-boot-starter

官⽹描述

All official starters follow a similar naming pattern; spring-boot-starter-_ , where _ is a particular type of application. This naming structure is intended to help when you need to find a starter. The Maven integration in many IDEs lets you search dependencies by name. For example, with the appropriate Eclipse or Spring Tools plugin installed, you can press ctrl-space in the POM editor and type “ spring-boot-starter ” for a complete list. As explained in the “Creating Your Own Starter ” section, third party starters should not start with spring-boot, as it is reserved for official Spring Boot artifacts. Rather, a thirdparty starter typically starts with the name of the project. For example, a third-party starter project called thirdpartyproject would typically be named thirdpartyproject-spring-boot-starter.

  1. 了解 SpringBoot 官⽅已经⽀持的 starter(引⼊依赖、开箱即⽤)
  2. 了解集成第三⽅ starter 的步骤(引⼊依赖、编写配置、开始使⽤)
  3. 开发⼀个⾃⼰的 starter(编写源码构建打包上传私服。。。、使⽤⽅式同 2)

有哪些官⽅已经默认集成的类库?

Spring Boot Reference Documentation

2. HelloWorld 及项⽬结构介绍

为了便于管理,我们统⼀⽤聚合⼯程来管理 SpringBoot 的学习内容

⼀、使⽤ IntellijIDEA 建⽴第⼀个 SpringBoot 项⽬

1. 新建⽗⼯程(保证联⽹)

2. 勾选 Web 依赖

项⽬⾸次创建过程请耐⼼等待。

项⽬构建完成之后删掉下⾯的这⼏个⽂件,这⼏个⽂件是 maven 版本控制相关的⽂件。我们结合 IDEA 管理 maven,⼀般来说这⼏个⽂件⽤不到。

删掉⽗⼯程 src ⽬录,不需要源码

3. 修改⽗⼯程的 packaging 类型为 pom

4. 创建第⼀个 module:boot-quickstart

5. ⼿动创建包、编写启动类、编写 Controller

6. 运 ⾏

观察启动⽇志

可以安装这个插件,简单的接⼝可以直接在 IDEA ⾥可视化测试

测试结果

⼆、HelloWorld 示例程序

resources ⽬录,新建 application.yml

yml ⽂件和 SpringBoot 默认的配置⽂件 properties 具有同样的功能

⼆者的区别在于:

yml ⽂件的层级更加清晰直观,但是书写时需要注意格式缩进对⻬。

yml 格式配置⽂件更有利于表达复杂数据结构的配置。⽐如:列表,对象等。

properties 阅读上不如 yml 直观,好处在于书写时不⽤特别注意格式缩进对⻬。

配置服务器端⼝,如果不配置默认为 8080

重启服务,观察结果

修改端⼝等信息后,插件还保留原端⼝,如果要插件也同步,可如图操作:

讨论,还有哪些⽅式可以来测试这个接⼝

postman、IDEA ⾃带的 HTTP Client、或者第三⽅ Apifox 等都可以

三、项⽬结构⽬录结构简介

项⽬结构⽬录符合 maven 规范要求:

目录位置 功能
src/main/java 项⽬ java ⽂件存放位置,初始化包含主程序⼊⼝ XxxApplication,可以通过直接运⾏该类来启动 Spring Boot 应⽤
src/main/resources 存放静态资源,图⽚、CSS、JavaScript、web ⻚⾯模板⽂件等
src/test 单元测试代码⽬录
.gitignore git 版本管理排除⽂件
target ⽂件夹 项⽬代码构建打包结果⽂件存放位置,不需要⼈为维护
pom.xml maven 项⽬配置⽂件
application.properties (application.yml) ⽤于存放程序的各种依赖模块的配置信息,⽐如服务端⼝,数据库连接配置等
  • src/main/resources/static 主要⽤来存放 css、图⽚、JS 等开发⽤静态⽂件
  • src/main/resources/public ⽤来存放可以直接⽤于访问的 html ⽂件
  • src/main/resources/templates ⽤来存放 web 开发模板⽂件

3. 需要先了解的核⼼概念

⼀、Spring Boot 、 Spring MVC 、Spring 对⽐

⾸先需要明⽩⼀件事情:SpringBoot ⽬的并不是替换 Spring、SpringMVC ,⽽是使它们⽤起来更加简单。

Spring 框架

Spring 框架最核⼼的特性就是

  • 依赖注⼊ DI(Dependency Injection)
  • 控制反转 IoC(Inversion Of Control)

如果能够合理的使⽤ DI 和 IoC,就可以开发出松耦合、扩展性好的的应⽤程序。

Spring MVC

Spring MVC 提供了⼀种友好的⽅式来开发 Web 应⽤程序。 通过使⽤诸如 Dispatcher Servlet, ModelAndView 和 View Resolver,可以轻松开发 Web 应⽤程序。

Spring Boot

Spring 和 Spring MVC 最⼤的弊病在于存在⼤量的配置,并且这些配置在不同的项⽬中具有很⾼的相似性。从⽽导致重复配置,繁琐⽽且杂乱!

Spring Boot 期望通过结合⾃动配置和 starters 来解决了这个问题。 另外,Spring Boot 还提供了⼀ 些功能,可以更快地构建可⽤于⽣产环境的应⽤程序。

⼆、Spring Boot ⾃动配置

Spring 和 Spring MVC 应⽤程序⾥⾯有⼤量的 XML 或 Java Bean 配置。

Spring Boot 为解决这个问题,提供了⼀种新的解决⽅案,新的思维⽅式。

SpringBoot 思考的⽅式:是不是可以更加智能⼀点,当 Spring 中加⼊⼀些新的 jar 包,加⼊⼀些配置,可以⾃动影响应⽤内 bean 的加载。

⽐如:Spring MVC JAR 位于类路径中时,⾃动配置 Dispatcher Servlet。当然,这些⾃动的默认配置不符合我们的要求的时候,我们可以修改。

三、什么是 Spring Boot Starter?

Spring Boot Starter 是⼀组被依赖第三⽅类库的集合

如果你要开发⼀个 web 应⽤程序,通过包管理⼯具(如 maven )引⼊ spring-boot-starter-web 就可以了,⽽不⽤分别引⼊下⾯这么多依赖类库,spring-boot-starter-web ⼀次性帮你引⼊下⾯的这些常⽤类库。

  • Spring — spring 核⼼, beans, context 上下⽂, AOP ⾯向切⾯
  • Web MVC — Spring MVC
  • Jackson — JSON 数据的序列化与反序列化
  • Validation — Hibernate 参数校验及校验 API
  • 嵌⼊式 Servlet Container — Tomcat
  • ⽇志框架 Logging — logback, slf4j

四、什么是 Spring Boot Starter Parent

所有的 Spring Boot 项⽬默认使⽤ spring-boot-starter-parent 作为应⽤程序的⽗项⽬。

<parent>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-parent</artifactId>
  <version>2.6.4</version>
  <relativePath/>
</parent>

继承⽗项⽬的好处在于:

  • 统⼀ Java 版本配置和其他的⼀些依赖类库的版本。
  • 引⼊第三⽅类库不要加版本号,⽗项⽬帮你统⼀管理版本,⽽且是经过兼容性测试的。>

当然⽗项⽬只能帮你管理⼀些常⽤类库的版本。

如果要引⼊⼀些不常⽤的 jar,可以⾃⼰管理版本号及兼容性。

五、嵌⼊式 Web 容器

Spring boot 打成 jar 包,默认包含嵌⼊式的 Web 容器 Tomcat。

使⽤ maven 打包,在⽗项⽬执⾏ clean->package

在⽣成的应⽤ jar 包⽬录,启动命令⾏,使⽤如下命令启动:

java -jar boot-quickstart.jar

这更有利于微服务的部署及微服务的构建、启动、扩容。

Spring Boot 还⽀持 Jetty 和 Undertow 作为 web 容器。

使⽤ maven 将 quickstart 项⽬打包,运⾏

六、Spring Data

Spring Data 的⽬标是提供⼀种更友好的⽅式或者是 API 来存取数据。

包括对于关系型数据库和 NOSQL 数据的⽀持,⽐如:

  • Spring Data JPA — 关系型数据库操作的 API,友好且易于使⽤。
  • Spring Data MongoDB -MongoDB 的操作 API。
  • Spring Data REST — 从持久层 Repositories ⾃动⽣成服务层 API,暴露 REST APIs 接⼝,超级好⽤。

当然,Spring Data 还有更多好⽤的特性和⽀持等待我们去探索。

七、SpringBoot 新版本特性

要关注官⽹关于新版本的基础环境要求、依赖组件升级、默认软件替换、新技术引⼊等说明。

7.1 基础环境升级

  • JDK 版本最低要求

7.2 依赖组件升级

  • Jetty
  • Tomcat
  • Flyway
  • Hibernate
  • Gradle
  • Thymeleaf

7.3 默认软件替换

  • 如默认数据库连接池从 Tomcat 切换到 HikariCP,HikariCP 是⼀个⾼性能的 JDBC 连接池, Hikari 是⽇语“光”的意思。
  • 如 redis 客户端默认使⽤ Lettuce 替换掉了 Jedis。Lettuce 是⼀个可伸缩的线程安全的 redis 客 户端,⽤于同步、异步和反应使⽤。

7.4 新技术的引⼊

  • 如响应式编程 WebFlux 的引⼊,重要的变⾰。
  • 如 SpringBoot2.x 开始默认⽀持 Quartz。
  • 如对 Kotlin 的⽀持。

7.5 彩蛋

SpringBoot ⾃定义启动 Banner

  • org.springframework.boot.ResourceBanner ⽂本格式,SpringBoot 会读取配置项 banner.txtbanner.location ,从配置项中获取真实的⽂件地址;如果配置中没有配置,会把 配置项作为⽂件去加载;

  • org.springframework.boot.ImageBanner 图⽚格式,SpringBoot 加载配置项 banner.image.location,从配置项中获取真实的路径,SpringBoot 会根据配置项的路径加载⽂件。

    如果没有配置 banner.image.location,转⽽依次加载 banner.gif、banner.jpg、 banner.png 这三个中存在的⽂件;

如果上⾯两种都没有配置,SpringBoot 就会加载默认的 Banner。

具体做法就是在 resource 下配置 banner.txt,另外对于图⽚⽣成可以去⼯具中⽣成。

以下⽹站可以⽣成⾃定义的 banner

http://www.degraeve.com/img2txt.php

https://www.bootschool.net/ascii

下载 banner.txt,放⼊ resources 根⽬录,重启服务器,效果

4. 提⾼开发效率必备⼯具 lombok

⼀、前置说明

  • 使⽤ lombok 插件的好处
  • 如何安装 lombok 插件
  • 使⽤ lombok 提⾼开发效率

⼆、使⽤ lombok 插件的好处

我们在 Java 开发过程中,经常会有⼀些常规性的,重复性的⼯作。⽐如:

  • 根据成员变量⽣成 get 和 set ⽅法
  • 根据成员变量⽣成类的构造函数
  • 重写 toString() 和 hashCode ⽅法
  • 引⼊⽇志框架 logFactory ,⽤来打印⽇志

以上都是⼀些重复动作,模板代码。每次都⼿动⽣成既浪费时间,⼜增加了⼤量的冗余代码。 我们可以使⽤ lombok 插件来解决这个问题。使我们的编码效率得到⼤幅度的提⾼。

三、如何安装 lombok 插件

打开 IDEA 的 Plugins 选项,搜索 “ lombok ”,点击 install,然后重启 IDEA。

新版 IDEA 已经内置了 lombok 插件

在 pom.xml ⾥⾯加 lombok 依赖。

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>

在 Spring Boot 项⽬⾥⾯不需要加⼊版本号,SpringBoot ⽗项⽬会代为管理。

如果是其他项⽬,需要⾃⾏添加版本号!

务必记得刷新 maven 才能⽣效。

四、 使⽤ lombok 注解简化开发

4.1 Data 注解

在 Java 类上使⽤ @Data 注解,该注解将为我们在编译期⾃动⽣成

  • 成员变量的 get 和 set ⽅法
  • equals ⽅法
  • canEqual ⽅法
  • hashCode ⽅法
  • toString ⽅法

上图左侧是使⽤ lombok 注解 Data,右侧是编译后的⽂件。

4.2 Slf4j 注解

该注解将在编译期⾃动帮我们引⼊ Logger ⽇志常量,我们在代码中就直接使⽤ log.info 或 log.debug 打印⽇志即可。下图右侧红⾊代码⽤ Slf4j 注解代替就可以了。

4.3 Builder 注解

在 Java 类上使⽤ Builder 注解之后,我们可以使⽤如下代码为对象属性赋值

Student student = Student().builder()
                       .name("Tom")
                       .age(20)
                       .build();

4.4 AllArgsConstructor 注解

该注解将为我们在编译期⾃动⽣成:全参构造函数。

有全参构造函数注解,⾃然就有⽆参构造函数注解:NoArgsConstructor 注解。

lombok 有⾮常多好⽤的注解,更多的⽤法参考:lombok 插件 github 地址

5. IDEA 环境下的热加载与热部署

在实际的开发过程中,我们经常修改代码之后,需要⼿动重启项⽬,⼿动刷新浏览器查看修改效果。

那么有没有⼀种⽅式能够快速的、⾃动的帮我们将修改代码⾃动更新,避免⼿动重启,从⽽提⾼开发效率呢?肯定是有的。

但是对于这个功能很多⼈对功能的叫法有争议,也没有权威的定义,知道的就有:热启动、热加载、热更新、热部署、热切换。这⼏个词从语义上是有区别的,但是叫什么并不重要,实现了最重要,毕竟绝⼤部分程序员为了使⽤这个功能⽅便开发,并不是专业搞学术研究的。

⼀、使⽤ JRebel 插件

这是最简单的⼀种⽅式,但是有⼀定的局限性,JRebel 插件是收费的,需要破解。

JRebel 插件在有些 Spring Boot 版本可能会不够兼容

具体做法前⾯已经普及。

⼆、 devtools 实现热加载

这是⼀种对于 SpringBoot ⽽⾔⽐较常⻅的⼀种实现⽅式。

2.1 引⼊ devtools 的 maven 依赖

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

spring-boot-devtools 从名称就可以看出来,是开发者⼯具包,其主要的功能就是实现热加载。

其实现原理就是两个 ClassLoader,⼀个负责加载那些不会经常改变的⽂件,⽐如:第三⽅ jar 包, ⼀旦引⼊项⽬之后这部分代码在调试过程中就处于不变的状态;⼀个负责加载可能经常改变的类, ⽐如我们⾃⼰在项⽬中写的代码,被称为 restart ClassLoader。当有代码发⽣改变的时候,重建⼀个 restart ClassLoader,原有的 restart ClassLoader 被丢掉。由于每次重新加载的内容较少,所 以速度⽐⼿动重启更快⼀些。

2.2 设置 IDEA

  • ⾸先,运⾏时编译配置:组合键:“Shift+Ctrl+Alt+/” ,选择 “Registry” ,选中打勾“compiler.automake.allow.when.app.running”

新版 IDEA 在这⾥,⽽且已经默认勾选

  • 其次,⾃动化编译配置: “File” -> “Settings” -> “Build,Execution,Deplyment” -> “Compiler”,选中打勾 “Build project automatically” 。这是⼀种重新⾃动化的编译整体项⽬ 的⽅法。但是⼀般不这么做,因为 IDEA 的⽂件是⾃动保存的,你想修改⼀个字符串,有可能你 只修改完成第⼀个字符它就重新编译了,重新加载启动。所以,⼀般代码修改完成之后,可以使⽤ Ctrl + F9 快捷键对修改类重新编译,⽽不是做项⽬的⾃动化编译

2.3 修改 application.properties 配置

在⽐较新的 SpringBoot devtools 版本中我们已经不需要做如下的配置了,但是如果你以上的步骤都完成了,仍然⽆法实现代码更改之后的热加载,请参考下⾯的⽅法。在有些版本我们需要配置热加载⽣效的开关,使其值等于 true。

properties 格式配置

#热加载⽣效
spring.devtools.restart.enabled=true
#额外新增的热加载⽬录
spring.devtools.restart.additional-paths= src/main/java
#热加载排除⽬录
#spring.devtools.restart.exclude=

yaml 格式配置

spring:
  devtools:
    restart:
      enabled: true
      additional-paths: src/main/java

2.4 LiveReload 插件

最后建议去 chrome 应⽤商店安装⼀个插件 LiveReload

Spring devtools 默认会启动⼀个 Live Reload Server 实例,监听⽂件的变化。并实时的与浏览器插件通信,更新浏览器展示界⾯。这样,你就不⽤每次更改内容之后都点击浏览器刷新按钮了。

2.5 测试

通常不⽣效的原因有两种:

  • JDK 编译版本和运⾏版本不统⼀,检查⼀下 IDEA 环境下 JDK 配置
  • 浏览器缓存或者其他的缓存软件导致的问题

6. 开发过程中常⽤ IDEA 插件

开发过程中,经常可以使⽤⼀些 IntelliJ IDEA 插件来提⾼⼯作效率

⼀、Codota

  • 极其强⼤的代码⾃动补全
  • 当我们第⼀次使⽤某个类,对该类的某个函数不够熟悉时,可以通过该插件搜索相关⽤法,模仿学习

⼆、Auto filling Java call arguments

开发中,我们通常会调⽤其他已经编写好的⽅法,调⽤后需要填充参数,但是绝⼤多数情况下,传⼊的变量名称和该函数的参数名⼀致,当参数较多时,⼿动单个填充参数⾮常浪费时间。

该插件就可以帮你解决这个问题。

安装完该插件以后,调⽤⼀个⽅法,使⽤ Alt+Enter 组合键,调出 “Auto fill call parameters” ⾃动使⽤该函数定义的参数名填充。

三、GsonFormatPlus

GsonFormatPlus 插件可以快速的将 JSON 转换为实体类

{
  "id": 1,
  "author": "syhan",
  "title": "SpringBoot",
  "content": "SpringBoot从⼊⻔到精通",
  "createTime": "2021-03-02 09:09:09",
  "reader": [
    {
      "name": "aaa",
      "age": 18
    },
    {
      "name": "bbb",
      "age": 20
    }
  ]
}

插件安装好之后,先定义⼀个空的实体类(只有类名和花括号),使⽤快捷键调出代码⽣成。

填⼊ JSON 代码

可以进⾏设置,⾃⾏研究⼀下

点击 OK 即可根据 JSON ⽣成对应的 Java 实体类代码。

四、Rainbow Brackets

代码由于括号太多,不确定当前代码⾏是否属于某个代码块,此时这个插件就会帮上⼤忙。

五、 Maven Helper

⽇常开发中,可能经常会遇到 jar 包冲突等问题,就需要通过查看 maven 依赖树来查看依赖情况。这 种⽅式不是很⾼效,这⾥推荐⼀个插件,安装之后,直接打开 pom ⽂件,即可查看依赖树,还能⾃动分析是否存在 jar 包冲突。

六、 Key promoter X

Key Promoter X 是⼀个提示插件,当你在 IDEA ⾥⾯使⽤⿏标的时候,如果这个⿏标操作是能够⽤快捷键替代的,那么 Key Promoter X 会弹出⼀个提示框,告知你这个⿏标操作可以⽤什么快捷键替 代。

七、Grep Console

Grep Console 是⼀款和 IDEA Console 相关的插件

可以通过 expression 表达式过滤⽇志、给不同级别的⽇志或者给不同 pattern 的⽇志加上颜⾊。

⼋、Background Image Plus

安装好插件后,在设置⾥可以选择背景图

九、RestfulTool

是⼀套 Restful 服务开发的辅助⼯具集

⼗、.gitignore

在提交项⽬到本地仓库的时候,会把 .idea ⽂件夹中的内容也提交上去,这⾥⾯放的是⼀些项⽬的配置信息,包括历史记录,版本控制信息等。

可以将不要传到 Git 上⾯去,还有其他的如 target ⽬录,⼀些账号配置⽂件等,设置为不要提交。 这个时候就需要编写 .gitignore ⽂件来忽略提交这些⽂件,在 IDEA 中的插件 .ignore 可以帮我们做这件事。

⼗⼀、Alibaba Cloud Toolkit

Alibaba Cloud Toolkit 是阿⾥云针对 IDE 平台为开发者提供的⼀款插件,⽤于帮助开发者⾼效开发并部署适合在云端运⾏的应⽤。

⼗⼆、Alibaba Java Coding Guidelines

该插件由阿⾥巴巴 P3C 项⽬组研发。

插件在扫描代码后,将不符合规约的代码显示出来,甚⾄还基于 Inspection 机制提供了实时检测功 能,编写代码的同时也能快速发现问题所在,还实现了批量⼀键修复的功能。


文章作者: Syhan
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Syhan !
评论
  目录