测试环境:
1. jdk 11
2. springboot 2.6.13
3. IDEA2023 2.6
1、什么是SpringBoot?
Springboot产生的背景
Servlet -> Spring -> SpringMVC,技术发展过程中,对使用者来说越来越简单,成本越来越低。
假设让你使用Spring开发一个简单的Hello World Web应用程序,你该做什么?
-
一个项目结构,其中有一个包含必要依赖的Maven构建文件,最起码要有Spring MVC和Servlet API这些依赖。
-
一个web.xml文件(或者一个WebApplicationInitializer实现),其中声明了Spring的DispatcherServlet。
-
一个启用了Spring MVC的Spring配置。
-
一个控制器类,以“Hello World”响应HTTP请求。
-
一个用于部署应用程序的Web应用服务器,比如Tomcat。
最让人难以接受的是,这份清单里只有一个东西是和Hello World功能相关的,即控制器,剩下的都是Spring开发的Web应用程序必需的通用样板。既然所有Spring Web应用程序都要用到它们,那为什么还要你来提供这些东西呢?
问题:Spring框架存在了大量的xml配置文件和依赖关系,为了解决这些问题,出现了Springboot框架
Spring Boot概述
Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化Spring应用的创建、运行、调试、部署等。使用Spring Boot可以做到专注于Spring应用的开发,而无需过多关注XML的配置。Spring Boot使用“约定大于配置(习惯优于配置)”的理念,简单来说,它提供了一堆依赖打包,并已经按照使用习惯解决了依赖问题。使用Spring Boot可以不用或者只需要很少的Spring配置就可以让企业项目快速运行起来。
Spring Boot是开发者和Spring 本身框架的中间层,帮助开发者统筹管理应用的配置,提供基于实际开发中常见配置的默认处理(即习惯优于配置),简化应用的开发,简化应用的运维;总的来说,其目的Spring Boot就是为了对Java web 的开发进行“简化”和加“快”速度,简化开发过程中引入或启动相关Spring 功能的配置。这样带来的好处就是降低开发人员对于框架的关注点,可以把更多的精力放在自己的业务代码上。
同时随着微服务概念的推广和实践,Spring Boot的精简理念又使其成为Java微服务开发的不二之选,也可以说,Spring Boot其实就是为了微服务而生的Java web框架。
先如今,Spring Boot已经在蓬勃发展的快速应用开发领域(rapid application development)成为领导者
Spring Boot的核心功能
1、 可独立运行的Spring项目:Spring Boot可以以jar包的形式独立运行。
2、 内嵌的Servlet容器:Spring Boot可以选择内嵌Tomcat、Jetty或者Undertow,无须以war包形式部署项目。
3、 简化的Maven配置:Spring提供推荐的基础 POM 文件来简化Maven 配置。
4、 自动配置Spring:Spring Boot会根据项目依赖来自动配置Spring 框架,极大地减少项目要使用的配置。
5、 提供生产就绪型功能:提供可以直接在生产环境中使用的功能,如性能指标、应用信息和应用健康检查。
6、 无代码生成和xml配置:Spring Boot不生成代码。完全不需要任何xml配置即可实现Spring的所有配置。
我们的主要目标是:
为所有Spring开发提供一个更快,更广泛的入门体验。
立即开始斟酌,但随着需求开始偏离默认值,快速避开
提供大型项目(如嵌入式服务器,安全性,指标,运行状况检查和外部配置)通用的一系列非功能性功能。
绝对不会生成代码,并且不需要XML配置
1.1、springboot的优缺点
一、优点
-
快速构建项目,无需xml配置文件;
-
无需手动管理jar包的依赖关系,使用Maven来进行统一管理;
-
无需外部服务器,有内置的tomcat服务器,可以直接启动项目;
-
配置热部署和自动启动;
-
对主流开发框架的无配置集成;
-
提供运行时的应用监控;
-
极大地提高了开发、部署效率;
-
与云计算的天然集成。
二、缺点
Spring Boot作为一个微框架,离微服务的实现还是有距离的。没有提供相应的服务发现和注册的配套功能,自身的acturator所提供的监控功能,也需要与现有的监控对接。没有配套的安全管控方案,对于REST的落地,还需要自行结合实际进行URI的规范化工作
1.2、为什么要用 Spring Boot?
SpringBoot并不是用来替代Spring的解决方案,而是和Spring框架紧密结合用于提升Spring开发者体验的工具,SpringBoot以约定大于配置的核心思想,默认帮我们进行了很多设置,同时它集成了大量常用的第三方库配置,SpringBoot应用中这些第三方库几乎可以零配置的开箱即用
1、良好的基因
因为SpringBoot是伴随着Spring 4.0而生的,boot是引导的意思,也就是它的作用其实就是在于帮助开发者快速的搭建Spring框架,因此SpringBoot继承了Spring优秀的基因,在Spring中开发更为方便快捷
2、简化依赖
比如我们要创建一个 web 项目,使用 Spring 的朋友都知道,在使用 Spring 的时候,需要在 pom 文件中添加多个依赖,而 Spring Boot 则会帮助开发着快速启动一个 web 容器,在 Spring Boot 中,我们只需要在 pom 文件中添加如下一个 starter-web 依赖即可
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
我们点击进入该依赖后可以看到,Spring Boot 这个 starter-web 已经包含了多个依赖,包括之前在 Spring 工程中需要导入的依赖,我们看一下其中的一部分,如下
<!-- .....省略其他依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.0.7.RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.0.7.RELEASE</version>
<scope>compile</scope>
</dependency>
由此可以看出,Spring Boot 大大简化了我们的编码,我们不用一个个导入依赖,直接一个依赖即可
3、简化配置
Spring 虽然使Java EE轻量级框架,但由于其繁琐的配置,一度被人认为是“配置地狱”。各种XML、Annotation配置会让人眼花缭乱,而且配置多的话,如果出错了也很难找出原因。Spring Boot更多的是采用 Java Config 的方式,对 Spring 进行配置
4、简化部署
在使用 Spring 时,项目部署时需要我们在服务器上部署 tomcat,然后把项目打成 war 包扔到 tomcat里,在使用 Spring Boot 后,我们不需要在服务器上去部署 tomcat,因为 Spring Boot 内嵌了 tomcat,我们只需要将项目打成 jar 包,使用 java -jar xxx.jar一键式启动项目
另外,也降低对运行环境的基本要求,环境变量中有JDK即可
2、使用Maven手动创建项目
2.1、创建Maven项目
这里也可以使用Maven Archetype来创建maven项目,两种方式都是可以完成构建maven项目
2.2、引入依赖项
为什么引入依赖项呢,因为我们现在目前跟springboot项目没有一点关系,需要有一个依赖来声明它是一个springboot项目就需要用到这个依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.13</version>
</parent>
到这一步之后声明了我们这个项目是一个springboot项目,但是还是不够的因为Spring Boot其实就是为了微服务而生的Java web框架,我们还需要引入一个依赖是springboot帮我们封装好的web依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
#因为我们引入的springboot依赖是2.6.13的,所有这里是不需要写版本号
#默认版本是我们 springboot依赖是2.6.13的版本
</dependency>
</dependencies>
到这里之后我们的依赖已经全部配好,我们可以检查一下是否已经添加上依赖
2.3、springboot启动入口
大家的包名可以不一样但是父包名最好不要用cn开头,有的时候可能会报错,希望能有一个良好的规范,加上包名
但是我们现在是没有任何controll,以及页面,所以我们需要写一点代码来测试一下吧
2.4、测试
因为我们以前使用ssm框架的时候需要配置context:component-scan 这个标签来扫描包,才会注入到bean容器,现在我们不需要配置任何xml,只需要将我们需要想被扫描的类放在与主入口同级或者子级下就可以被扫描到
RestController注解: 是一个组合式注解,里面包含了controller注解以及ResponseBody注解,意思就是RestController下的所有路径都跳过视图解析器,直接向前端返回数据
注意: 浏览器只默认支持get请求方式
我们现在可以启动来访问项目 http://localhost:8080/test/hello
2.5、第三方工具
分享一个第三方工具用来进行测试===>Apifox https://apifox.com/
Apifox = Postman + Swagger + Mock + JMeter
具体的可以看apifox的官方文档 https://apifox.com/help/api-docs/api-design
可以通过它来访问路径,不需要再进入我们的页面访问
首先第一步先创建一个项目
第二步创建接口
第三步设置我们的环境
第四步管理我们的环境改为我们本地的8080端口
第五步进行测试路径
2.6、扩展
GetMapping注解相当于RequestMapping(value = "hello",method = RequestMethod.GET) PostMapping注解相当于RequestMapping(value = "hello",method = RequestMethod.Post)
当我们请求/test这个路径时,如果是在浏览器上他是默认走get请求,走不了post请求的,它会找到我们的get方法,所以我们推荐使用第三方工具来完成
而hello这个方法需要指定明确的路径
总结:这种方式是resultful风格,是一种风格,不是一种约束,我们可以通过使用resultful风格,避免我们的路径只用一次就被抛弃,我们多个路径都可以是一样的,只是请求的方式不一样,或者参数一样
3、使用阿里的脚手架创建项目
3.1、创建springboot项目
我们可以通过访问https://start.aliyun.com/ 来创建一个项目
我们可以在创建之前就引入我们的web依赖
创建好之后使用idea打开,与我们手动创建一样,我们直接跳过
4、使用阿里的镜像创建项目
4.1、创建springboot项目
这里的镜像默认是spring自己的,但是因为在外国,网络有时候加载不进来,所以我们使用阿里的镜像创建springboot项目https://start.aliyun.com/
点击下一步之后选择我们的web依赖
注意: 使用阿里的镜像结构是不一样的但是我们可以删除掉,改为正确的,比如包下有一个demo包,我们是可以删除的
5、SpringBoot常见面试题
5.1、SpringBoot的核心注解是哪个?它主要由哪几个注解组成的?
Spring Boot 的核心注解是 @SpringBootApplication,它是一个复合注解,包含了多个注解,用于标记应用程序入口类。在使用 Spring Boot 开发应用程序时,只需要在主类上加上这个注解,就能够自动完成很多配置工作,使得开发人员专注于业务逻辑的开发
@SprintBootApplication 包括以下三个注解:
一、@SpringBootConfiguration
这个注解继承自 @Configuration 注解,表示这是一个配置类,并且会被 Spring Boot 自动扫描到,用于定义配置信息,如数据库连接信息、消息队列配置等。在 Spring Boot 中,其实所有的配置都可以通过 Java 代码来完成,这个注解就是用来实现这个功能的
二、 @EnableAutoConfiguration
这个注解表示开启自动配置功能。Spring Boot 提供了很多自动配置的类,如 Tomcat、Jackson、Thymeleaf 等,这些类在使用时不需要再手动进行配置,Spring Boot 会自动加载这些类并完成配置。在使用这个注解时,Spring Boot 会根据应用程序中引入的依赖自动进行配置,减少了开发者的工作量。
三、 @ComponentScan
这个注解用于定义 Spring 所扫描的包路径,用于扫描带有@Component、@Service、@Repository 和@Controller 注解的类,并将这些类纳入 Spring 容器中管理,开发者可以通过 @Autowired 注解来获取这些 Bean。
5.2、Spring Boot 的核心配置文件有哪几个?它们的区别是什么?
值的写法
application.properties 配置文件比较简单,形式是以键值对来编写的
application.yml 配置文件使用YMAL语言,YMAL不是如XML般的标记语言,更适合作为配置文件,yml是以树状的形式来编写的
SpringBoot的核心配置文件有application和bootstarp配置文件。
在 Spring Boot 中有两种上下文,一种是 bootstrap, 另外一种是 application, bootstrap 是应用程序的父上下文,也就是说 bootstrap 加载优先于 applicaton。bootstrap主要用于从额外的资源来加载配置信息,还可以在本地外部配置文件中解密属性。这两个上下文共用一个环境,它是任何Spring应用程序的外部属性的来源。bootstrap 里面的属性会优先加载,它们默认也不能被本地相同配置覆盖。
5.3、springboot的自动装配原理
SpringBoot 定义了一套接口规范,这套规范规定:SpringBoot 在启动时会扫描外部引用 jar 包中的 META-INF/spring.factories 文件,将文件中配置的类型信息加载到 Spring 容器并执行类中定义的各种操作。
对于外部 jar 包来说,只需要按照 SpringBoot 定义的标准,就能将自己的功能装置进 SpringBoot.
自动装配可以简单理解为:通过注解或者一些简单的配置就能在 SpringBoot 的帮助下实现某块功能
自动装配可以简单理解为:通过注解或者一些简单的配置就能在 Spring Boot 的帮助下实现某块功能
@EnableAutoConfiguration:实现自动装配的核心注解
我觉得网上说的太复杂,用我自己的话说一下自动装配,为什么我们不用配置xml了呢,就是使用了我们的自动装配,当我们启动主入口的时候,springboot已经帮我们自动装配好了
当我们引入依赖的时候都会被springboot的自动装配识别到
启动之后他会加载这个文件,这里面有许多的配置文件,但是有的爆红是为什么呢
前缀是 ConditionalOn是springboot的底层代码,意思就是如果你没有引入这个依赖,这个类是不生效,比如我们查找到web的核心依赖
点进去是不会爆红的
这个web的核心文件引入了一个默认的资源XXXProperties,是启动之后默认的就是这些资源,我们可以使用核心配置文件来覆盖掉这些可以使用spring.mvc