写点什么

快速上手 SpringBoot

作者:亮点
  • 2022 年 10 月 11 日
    甘肃
  • 本文字数:7454 字

    阅读完需:约 24 分钟

快速上手SpringBoot

一、SpringBoot 概述

SpringBoot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化 Spring 应用的初始搭建以及开发过程。SpringBoot 是 Spring 项目中的一个子工程,也被称为搭建程序的脚手架,可以快速的构建 spring 项目。


Spring 程序缺点:


  • 依赖设置繁琐

  • 配置繁琐


SpringBoot 程序优点:


  • 起步依赖(简化依赖配置)

  • 自动配置(简化常用工程相关配置)

  • 辅助功能(内置服务器,……)

二、创建 SpringBoot 工程的四种方式

1、基于 Idea 创建 SpringBoot 工程

(1)步骤:SpringBoot 入门程序

  • ①:创建新模块,选择 Spring Initializr,并配置模块相关基础信息(新建模块中没有 Spring Initializr 选项的解决办法:setting中找到plugins插件,搜索 Spring Boot,安装重启)




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



  • ③:开发控制器类


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


  • ④:运行自动生成的 Application 类


(2)最简 SpringBoot 程序所包含的基础文件

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>2.5.4</version>   </parent>    <groupId>com.itheima</groupId>    <artifactId>springboot-01-quickstart</artifactId>    <version>0.0.1-SNAPSHOT</version>    <dependencies>     <dependency>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-web</artifactId>     </dependency>   </dependencies></project>
复制代码

Application 类

@SpringBootApplicationpublic class Application {  public static void main(String[] args) {    SpringApplication.run(Application.class, args);  }}
复制代码

(3)Spring 程序与 SpringBoot 程序对比


注意:基于idea开发SpringBoot程序需要确保联网且能够加载到程序框架结构

(4)总结

1. 开发 SpringBoot 程序可以根据向导进行联网快速制作 2. SpringBoot 程序需要基于 JDK8 进行制作 3. SpringBoot 程序中需要使用何种功能通过勾选选择技术 4. 运行 SpringBoot 程序通过运行 Application 程序入口进行

(5)Idea 中隐藏指定文件或指定类型文件

  • Setting → File Types → Ignored Files and Folders

  • 输入要隐藏的文件名,支持*号通配符

  • 回车确认添加

2、基于 SpringBoot 官网创建项目

如果 idea 不能联网,我们可以去 spring 的官网去创建地址: https://start.spring.io/(可直接创建)


步骤:


  1. 打开 SpringBoot 官网,选择 Quickstart Your Project(最下边)

  2. 创建工程,并保存项目


  3. 解压项目,通过 IDE 导入项目(与之前相同)

  4. 创建一个 Controller 测试

3、基于阿里云创建 SpringBoot 工程

如果网站被限制访问,阿里提供了一个,我们在创建工程时,切换选择 starter 服务路径,然后手工收入阿里云提供给我们的使用地址


地址: https://start.aliyun.com


步骤:


  1. 选择 start 来源为自定义 URL

  2. 输入阿里云 start 地址

  3. 创建项目



阿里云地址默认创建的 SpringBoot 工程版本是 2.4.1,如果需要使用高版本,进入工程后手工切换 SpringBoot 版本


4、手工创建 Maven 工程修改为 SpringBoot 工程

SpringBoot 工程创建的时候就是去下载一些必要的组件的,如果没有网络,把这些东西给提前准备好就可以了


步骤:


  1. 创建普通 Maven 工程

  2. 继承 spring-boot-starter-parent


<?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 http://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>2.7.1</version> </parent>
<groupId>com.shiyimo</groupId> <artifactId>springboot1</artifactId> <version>1.0-SNAPSHOT</version>
<properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> </properties>
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
</dependencies>
</project>
复制代码


  1. 添加依赖 spring-boot-starter-web


<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">    <modelVersion>4.0.0</modelVersion>
<groupId>org.shiyimo</groupId> <artifactId>spring4</artifactId> <version>1.0-SNAPSHOT</version>
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.1</version> </parent>
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies></project>
复制代码


  1. 制作引导类 Application


package com.itheima;
import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplicationpublic class Application { public static void main(String[] args) { SpringApplication.run(Application.class,args); }}
复制代码


  1. 创建一个 Controller 测试是否能用

三、SpringBoot 的 parent、starter、引导类、内嵌 tomcat

1、parent

pom.xml 文件中的<parent> </parent>


<parent>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-parent</artifactId>    <version>2.5.4</version></parent>
复制代码


打开后可以查阅到其中又继承了一个坐标


<parent>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-dependencies</artifactId>    <version>2.5.4</version></parent>
复制代码


点击<artifactId>spring-boot-dependencies</artifactId>打开,可以发现各式各样的依赖版本号属性,可以看的出来,定义了若干个技术的依赖版本号


<properties>    <activemq.version>5.16.3</activemq.version>    <aspectj.version>1.9.7</aspectj.version>    <assertj.version>3.19.0</assertj.version>    <commons-codec.version>1.15</commons-codec.version>    <commons-dbcp2.version>2.8.0</commons-dbcp2.version>    <commons-lang3.version>3.12.0</commons-lang3.version>    <commons-pool.version>1.6</commons-pool.version>    <commons-pool2.version>2.9.0</commons-pool2.version>    <h2.version>1.4.200</h2.version>    <hibernate.version>5.4.32.Final</hibernate.version>    <hibernate-validator.version>6.2.0.Final</hibernate-validator.version>    <httpclient.version>4.5.13</httpclient.version>    <jackson-bom.version>2.12.4</jackson-bom.version>    <javax-jms.version>2.0.1</javax-jms.version>    <javax-json.version>1.1.4</javax-json.version>    <javax-websocket.version>1.1</javax-websocket.version>    <jetty-el.version>9.0.48</jetty-el.version>    <junit.version>4.13.2</junit.version></properties>
复制代码


各式各样的的依赖坐标信息,可以看出依赖坐标定义中没有具体的依赖版本号,而是引用了第一组信息中定义的依赖版本属性值


<dependencyManagement>    <dependencies>        <dependency>            <groupId>org.hibernate</groupId>            <artifactId>hibernate-core</artifactId>            <version>${hibernate.version}</version>        </dependency>        <dependency>            <groupId>junit</groupId>            <artifactId>junit</artifactId>            <version>${junit.version}</version>        </dependency>    </dependencies></dependencyManagement>
复制代码


注意:上面的依赖坐标定义是出现在标签中的,其实是对引用坐标的依赖管理,并不是实际使用的坐标。因此当我们的项目中继承了这组 parent 信息后,在不使用对应坐标的情况下,前面的这组定义是不会具体导入某个依赖的。


总结:

  1. 开发 SpringBoot 程序要继承 spring-boot-starter-parent

  2. spring-boot-starter-parent 中定义了若干个依赖管理

  3. 继承 parent 模块可以避免多个依赖使用相同技术时出现依赖版本冲突

  4. 继承 parent 的形式也可以采用引入依赖的形式实现效果

2、starter

starter 定义了使用某种技术时对于依赖的固定搭配格式,也是一种最佳解决方案,使用 starter 可以帮助开发者减少依赖配置


<font color="red"><code class="language-xml"><dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-web</artifactId></dependency></code></font>
复制代码


比如开发 web 应用,就需要引入上面的 web 对应的 starter 依赖,并没有写 SpringMVC 的坐标,点击 <artifactId>spring-boot-starter-web</artifactId>


<font color="red"><code class="language-xml"><dependencies>    <dependency>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter</artifactId>        <version>2.5.4</version>        <scope>compile</scope>    </dependency>    <dependency>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-json</artifactId>        <version>2.5.4</version>        <scope>compile</scope>    </dependency>    <dependency>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-tomcat</artifactId>        <version>2.5.4</version>        <scope>compile</scope>    </dependency>    <dependency>        <groupId>org.springframework</groupId>        <artifactId>spring-web</artifactId>        <version>5.3.9</version>        <scope>compile</scope>    </dependency>    <dependency>        <groupId>org.springframework</groupId>        <artifactId>spring-webmvc</artifactId>        <version>5.3.9</version>        <scope>compile</scope>    </dependency></dependencies></code></font>
复制代码


可以发现叫做 spring-boot-starter-json 的名字中也有 starter,这个 starter 中又包含了若干个坐标,其实就是使用 SpringMVC 开发通常都会使用到 Json


总结:

  1. 开发 SpringBoot 程序需要导入坐标时通常导入对应的 starter

  2. 每个不同的 starter 根据功能不同,通常包含多个依赖坐标

  3. 使用 starter 可以实现快速配置的效果,达到简化配置的目的

3、引导类

下面说一下程序是如何运行的。目前程序运行的入口就是 SpringBoot 工程创建时自带的那个类,启动方式:


<font color="red"><font color="red"><code class="language-java">@SpringBootApplication  public class Springboot01QuickstartApplication {    public static void main(String[] args) {      SpringApplication.run(Springboot01QuickstartApplication.class, args);    }   }</code></font></font>
复制代码


SpringBoot 的引导类是 Boot 工程的执行入口,运行 main 方法就可以启动项目


SpringBoot 工程运行后初始化 Spring 容器,扫描引导类所在包加载 bean


当前这个类运行后就会产生一个 Spring 容器对象,并且可以将这个对象保存起来,通过容器对象直接操作 Bean


<font color="red"><font color="red"><code class="language-java">@SpringBootApplicationpublic class SpringbootApplication {    public static void main(String[] args) {        ConfigurableApplicationContext context = SpringApplication.run(SpringbootApplication.class, args);        User user = context.getBean(User.class);        System.out.println(user);    }}</code></font></font>
复制代码


总结:

  1. SpringBoot 工程提供引导类用来启动程序

  2. SpringBoot 工程启动后创建并初始化 Spring 容器

4、辅助功能(内嵌 tomcat)

启动了一个 web 服务器,在引入的spring-boot-starter-web场景 starter 中


<font color="red"><font color="red"><code class="language-xml"><dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-web</artifactId></dependency></code></font></font>
复制代码


点击打开spring-boot-starter-web


<font color="red"><font color="red"><code class="language-xml"><dependencies>    <dependency>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter</artifactId>        <version>2.5.4</version>        <scope>compile</scope>    </dependency>    <dependency>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-json</artifactId>        <version>2.5.4</version>        <scope>compile</scope>    </dependency>    <dependency>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-tomcat</artifactId>        <version>2.5.4</version>        <scope>compile</scope>    </dependency>    <dependency>        <groupId>org.springframework</groupId>        <artifactId>spring-web</artifactId>        <version>5.3.9</version>        <scope>compile</scope>    </dependency>    <dependency>        <groupId>org.springframework</groupId>        <artifactId>spring-webmvc</artifactId>        <version>5.3.9</version>        <scope>compile</scope>    </dependency></dependencies></code></font></font>
复制代码


tomcat 对应的东西


<font color="red"><font color="red"><code class="language-xml"><dependencies>    <dependency>        <groupId>jakarta.annotation</groupId>        <artifactId>jakarta.annotation-api</artifactId>        <version>1.3.5</version>        <scope>compile</scope>    </dependency>    <dependency>        <groupId>org.apache.tomcat.embed</groupId>        <artifactId>tomcat-embed-core</artifactId>        <version>9.0.52</version>        <scope>compile</scope>        <exclusions>            <exclusion>                <artifactId>tomcat-annotations-api</artifactId>                <groupId>org.apache.tomcat</groupId>            </exclusion>        </exclusions>    </dependency>    <dependency>        <groupId>org.apache.tomcat.embed</groupId>        <artifactId>tomcat-embed-el</artifactId>        <version>9.0.52</version>        <scope>compile</scope>    </dependency>    <dependency>        <groupId>org.apache.tomcat.embed</groupId>        <artifactId>tomcat-embed-websocket</artifactId>        <version>9.0.52</version>        <scope>compile</scope>        <exclusions>            <exclusion>                <artifactId>tomcat-annotations-api</artifactId>                <groupId>org.apache.tomcat</groupId>            </exclusion>        </exclusions>    </dependency></dependencies></code></font></font>
复制代码


这里有一个核心的坐标,tomcat-embed-core,叫做 tomcat 内嵌核心。就是这个东西把 tomcat 功能引入到了我们的程序中。


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


<font color="red"><font color="red"><code class="language-xml"><dependencies>    <dependency>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-web</artifactId>        <exclusions>            <exclusion>                <groupId>org.springframework.boot</groupId>                <artifactId>spring-boot-starter-tomcat</artifactId>            </exclusion>        </exclusions>    </dependency>    <dependency>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-jetty</artifactId>    </dependency></dependencies></code></font></font>
复制代码


Jetty 比 Tomcat 更轻量级,可扩展性更强(相较于 Tomcat),谷歌应用引擎(GAE)已经全面切换为 Jetty


内置服务器


  • tomcat(默认) : apache 出品,粉丝多,应用面广,负载了若干较重的组件

  • jetty:更轻量级,负载性能远不及 tomcat

  • undertow:undertow,负载性能勉强跑赢 tomcat


总结:

  1. 内嵌 Tomcat 服务器是 SpringBoot 辅助功能之一

  2. 内嵌 Tomcat 工作原理是将 Tomcat 服务器作为对象运行,并将该对象交给 Spring 容器管理

  3. 变更内嵌服务器思想是去除现有服务器,添加全新的服务器




看到最后,点个赞吧!


发布于: 刚刚阅读数: 4
用户头像

亮点

关注

还未添加个人签名 2022.08.25 加入

还未添加个人简介

评论

发布
暂无评论
快速上手SpringBoot_spring-boot_亮点_InfoQ写作社区