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.
- 了解 SpringBoot 官⽅已经⽀持的 starter(引⼊依赖、开箱即⽤)
- 了解集成第三⽅ starter 的步骤(引⼊依赖、编写配置、开始使⽤)
- 开发⼀个⾃⼰的 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.txt
和banner.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 机制提供了实时检测功 能,编写代码的同时也能快速发现问题所在,还实现了批量⼀键修复的功能。