Spring Boot介绍
在学习Spring Boot之前,我们先来认识一下Spring
Spring官方是这样介绍的:

可以看到,Spring让Java程序更加快速,简单和安全。Spring对于速度,简单性和生产力的关注使其成为世界上最流行的Java框架
Spring官方为我们提供了很多开源的项目,覆盖范围从Web开发到大数据,Spring发展到了今天,已经形成了自己的生态圈。我们在开发时,也倾向于使用Spring官方提供的技术,来解决对应的问题
Spring开源项目:

我只能截到这么多,实际上还有很多。大家可以自行到https://spring.io/去看
这些项目都是基于Spring Framework来进行开发的,但是Spring Framework存在配置多,入门难的问题,Spring也意识到了这个问题,为了简化开发者的使用,从而创造性的推出了Spring Boot
接下来,我们看下什么是Spring Boot
Spring Boot的诞生,是为了简化Spring程序开发的
Spring Boot翻译一下就是Spring 脚手架。那什么是脚手架呢?如下图所示:

盖房子的这个架子就是脚手架,脚手架的作用是砌筑砖墙,浇筑混凝土、方面墙面抹灰,装饰和粉刷的,简单来说,就是使用脚手架可以更快速的盖房子
而Spring Boot就是Spring框架的脚手架,它是为了快速开发Spring框架而诞生的
Spring Boot项目创建
使用IDEA创建
使用社区版需要额外安装插件,而且后续学习中,会发现社区版有很多限制。我们这里建议大家能够换成专业版IDEA,现在网络上有很多种破解专业版IDEA的方式。大家可以试一下
接下来,我们使用专业版IDEA创建Spring Boot项目:
File->New->Project

点击Next,然后选择Spring Boot版本,并添加依赖

注意:
Spring Boot版本,选择任意3.x的,这个版本会随着Spring Boot的升级而发生变化,不固定。
3.x版本使用的是jdk17,3.x以下使用的是jdk8
这里我们想要添加什么依赖(框架,插件,组件等....后面再细讲),就打勾即可
然后点击Finish即可生成一个Spring Boot项目。如下图:
注意事项:
第一次打开Spring Boot项目需要加载很久,因为当前Spring Boot框架并没有在自己的本地仓库
为了加速Spring Boot项目的下载,在打开项目之前,请先确定自己的Maven已经配置为国内源
项目代码和目录介绍
观察pom文件
XML
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.4.4</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.fei</groupId>
<artifactId>Spring_Boot_demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>Spring_Boot_demo</name>
<description>Demo project for Spring Boot</description>
<url/>
<licenses>
<license/>
</licenses>
<developers>
<developer/>
</developers>
<scm>
<connection/>
<developerConnection/>
<tag/>
<url/>
</scm>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
pom.xml文件里的具体信息,我们不需要过度关注。主要看<dependencies>标签里面的内容即可
在pom文件中,引入了两个依赖
·spring-boot-starter-web:包含了web应用开发所需要的常见依赖
·spring-boot-starter-test:包含了单元测试所需要的常见依赖
父工程
但是我们发现在上述我们添加依赖时,并没有指定具体的版本号,但我们的jar包也正常引入到项目中了。


但是如果查看的话,其实是有版本号的

我们再来看看本地仓库的jar包是否也下载下来了呢?

据图可知,本地仓库的jar包也下载了
那为什么没有指定版本,程序也可以正常运行呢?
因为每一个Spring Boot工程,都有一个父工程。依赖的版本号,在父工程中统一管理
父工程指定版本号后,就会自动引入和所指定版本对应的依赖,创建的Spring Boot项目,会继承Spring Boot父工程
在pom.xml中,找到父工程

进入父工程(spring-boot-starter-parent)中

查看依赖版本,进入spring-boot-dependencies中

目录介绍

Spring Boot项目有两个主要的目录:
·src/main/java:Java源代码
·src/main/resources:为静态资源或配置文件:
·/static:静态资源文件夹,比如学习的js、css、html等静态文件,不需要服务器数据进行绑定的页面
·/templates:模板资源文件夹,主要存放动态模板文件,比如JSP、Freemarker、Thymeleaf等需要服务器动态渲染数据的文件
·src/test/java:测试代码源代码
·target:编译后的文件路径
·pom.xml:maven配置文件
注意:在刚创建好Spring Boot项目时,有一些不必要的可以进行选择性删除。如上图的:.mvn//.gitattributes//HELP.md/mvnw/mvnw.cmd
运行项目
我们在学习Spring框架这里,记得 实践>>理论(我们先跟着上手操作,后续再讲解原因)


我们可以看到在SpringBootDemoApplication这个类上面有一串黄色代码 @SpringBootApplication
@SpringBootApplication:这是SpringBoot启动类注解
我们这里点击启动类的main方法就可以运行Spring Boot项目了,启动成功如下图:

有@SpringBootApplication注解的类即为启动类

java
@SpringBootApplication
public class SpringBootDemoApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootDemoApplication.class, args);
}
}
我们需要记住以下几点 :
1.启动类本身就是一个main方法,是Spring Boot应用的入口
2.代码需放在启动类包或其子包下。(不放的话,需要额外操作)
3.避免直接运行其他类的main方法(会破坏Spring的依赖管理)
输出Hello world
我们的【JavaEE进阶】专栏,更多是围绕着如何使用Java来进行Web开发
之前我们所讲的都是Java基础,是没办法直接和浏览器进行互动的。所以接下来我们要用SpringBoot来实现和浏览器及用户的交互
在创建的项目名包(com.fei.spring_boot_demo)路径下创建UserController文件。
也是为了保证代码放在启动类包或其子包下。
实现代码如下:
java
package com.fei.spring_boot_demo.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RequestMapping("/user")
@RestController
public class UserController {
@RequestMapping("hello")
public String hello(){
return "Hello world";
}
}
在我们写完代码后,每次都需要重新启动 启动类
重新启动项目,然后访问 http://127.0.0.1:8080/user/hello 最终效果如下:

我们这里先不纠结 原因。我们先敲代码。如果我们先学习理论知识,再去敲代码,不知道要学到猴年马月。
Web服务器
浏览器和服务器两端进行数据交互,使用的就是HTTP协议

HTTP协议是HTTP客户端和HTTP服务器之间的交互数据的格式
Web服务器就是对HTTP协议进行封装,程序员不需要直接对协议进行操作(自己写代码去解析http协议规则),让Web开发更加便捷,所以Web服务器也被称为WWW服务器。HTTP服务器,主要功能就是提供网上信息浏览服务
常见的Web服务器有:Apache,Nginx,IIS,Tomcat,Jboss等
Spring Boot内置了Tomcat服务器,无需配置即可直接运行

Tomcat默认端口号是8080,所以我们程序访问时的端口也是8080
请求响应流程分析
浏览器输入URL后,发起请求,就和服务器之间建立了连接

浏览器:
·输入网址:http://127.0.0.1:8080/user/hello
·通过IP地址127.0.0.1定位到网络上的一台计算机,127.0.0.1就是本机
·通过端口号8080找到计算机上对应的进程,也就是在本地计算机中找到正在运行的8080端口的程序
·/user/hello是请求资源位置
·资源:对计算机而言,资源就是数据
·Web资源:通过网络可以访问到的资源(通常是指存放在服务器上的数据)
http://127.0.0.1:8080/user/hello,就是向本地计算机中的8080端口程序,获取资源位置是user/hello的数据
8080端口程序,在服务器找/hello位置的资源数据,发给浏览器
服务器:
·接收到浏览器发送的信息(如:/user/hello)
·在服务器上找到/user/hello的资源
·把资源发送给浏览器
常见报错
访问出错怎么办
404
404表示用户访问的资源不存在。大概率是URL的路径写的不正确
错误实例1:url单词拼错

错误实例2:注解写错
java
@RequestMapping("/user")
@Controller //把RestController写成了Controller
public class UserController {
@RequestMapping("hello")
public String hello(){
return "Hello world";
}
}
这时候访问时,也会报错404
通过Fiddler观察HTTP请求

500
服务器内部出现错误。一般是服务器的代码在执行过程中遇到了一些特殊情况(如服务器异常崩溃)就会产生500状态码
错误实例:
java
@RequestMapping("/user")
@RestController
public class UserController {
@RequestMapping("hello")
public String hello(){
int res=10/0;
return "Hello world";
}
}
重启Tomcat服务器,然后重新访问页面,我们可以看到:

并且,此时程序后端控制台也打印了具体的异常调用栈

异常信息里已经提示了:出现异常的代码是UserController.java的第12行
错误原因:算术异常-->除数为0
我们只需要按照异常提示,去解决对应的问题即可
无法访问此网站
一般是Tomcat启动失败了
这种情况一般是服务未成功启动,也就是tomcaat未启动,或者IP/端口写错
打开Fiddler的话(我的Edge浏览器也是),页面如下:

小结
最开始学习Spring的时候,会遇到很多问题,更多是环境相关的问题
我们不仅要学习Spring代码的基本写法,更重要的是学习排查错误的思路
程序员调试BUG如同医生诊病
一个有经验的程序员和一个新手程序员相比,最大的优势往往不是代码写的多好,而是调试效率有多高。同一个问题可能新手花了几天都无法解决的,但是有经验的程序员可能几分钟就搞定了
熟悉HTTP协议能让我们调试问题事半功倍
·4xx状态码表示路径不存在,往往需要检查URL是否正确,和代码中设定的Context Path以及Servlet Path是否一致
·5xx的状态码表示服务器出现错误,往往需要观察页面提示的内容和Tomcat自身的日志,观察是否存在报错
·出现连接失败往往意味着服务没有正确启动,也需要观察 服务的自身日志是否有错误提示
观察日志是调试程序的重要途径。系统日志往往很多,需要同学们耐心阅读,经常阅读,熟练了就能更快速的找到问题了
Spring Boot是为了快速开发Spring而诞生的,Spring Boot具备:
·Spring Boot提供了启动添加依赖的功能,可以快速集成框架;
·内置Web服务器,无需配置Tomcat等Web服务器,直接运行和部署程序
·可以完全抛弃繁琐的XML,使用注解和配置的方式进行开发
·支持更多的监控的指标,可以更好的了解项目的运行情况等特点
Spring Boot可使用IDEA或网页创建,它的设计思想是约定大于配置,类上标注@SpringBootApplication就可以启动Spring Boot项目了