【01】Spring Boot 入门之 Hello World

第一章:Spring Boot 入门

一、Spring Boot 出现的背景

J2EE 笨重的开发、繁多的配置、低下的开发效率、复杂的部署流程、第三方技术集成难度大 ,从而诞生了 Spring Boot 。举个栗子,如果不用 Spring Boot ,平时我们开发一个 Web 应用程序需要以下步骤:

传统 Web 应用开发步骤:
1、新建一个 web 工程 2、引入依赖 3、配置 web.xml 文件 4、配置框架本身的配置文件 5、加入运行容器 6、调试运行

在这些步骤中,可能感触最深的或者最麻烦的就是引入各种依赖和配置各种 xml 文件 ,一不小心,依赖包可能冲突,或者缺少,配置文件也可能写错。有的时候,我们可能只是开发的一个很小的 web 应用,但是搭建环境可能比写业务代码花的时间长 ,想起来头都大。。。或者得不偿失。这时,Spring Boot 就诞生了!

二、Spring Boot 简介

相关链接:

Spring 官网: Spring 官网
Spring Boot 官网: Spring Boot 官网
使用文档: Spring boot 使用文档

Spring Boot 是由 Pivotal 团队 提供的全新框架,其设计目的是用来简化 Spring 应用的初始搭建以及开发过程 。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。


Spring Boot 简化了基于 Spring 的应用开发,约定大于配置,去繁从简 ,通过少量的代码就能创建一个独立的、产品级别的 Spring 应用。不仅如此,Spring Boot 为 Spring 平台及第三方库提供【开箱即用】的设置 ,这样你就可以有条不紊地开始。Spring Boot 的核心思想就是约定大于配置,多数 Spring Boot 应用只需要很少的 Spring 配置 。采用 Spring Boot 可以大大的简化你的开发模式,所有你想集成的常用框架,它都有对应的组件支持。

三、Spring Boot 优缺点

Spring Boot 优点:
1、快速创建独立运行的 Spring 项目以及与主流框架集成 2、使用嵌入式的 Servlet 容器,应用无需打成 WAR 包 3、starters 自动依赖与版本控制 4、大量的自动配置,简化开发,也可修改默认值 5、无需配置 XML,无代码生成,开箱即用 6、准生产环境的运行时应用监控 7、与云计算的天然集成
Spring Boot 缺点:
Spring Boot 唯一的缺点就是入门容易,精通难,只有对 Spring 非常的了解,才能够深度定制 Spring Boot
Spring Boot 就是:
1、简化 Spring 应用开发的一个框架 2、整个 Spring 技术栈的一个大整合 3、J2EE 开发的一站式解决方案

四、微服务简介

【微服务】是一种架构风格,它能够将单一程序开发成一组小型服务的组合,每一个功能元素最终都是一个可独立替换和独立升级的软件单元。这些小型服务可以使用不同的编程语言以及数据存储技术 ,每一个微服务运行在自己的进程中,使用轻量级机制通信,并通过完全自动化部署机制来独立部署。

微服务:
1、始于 2014 年,martin fowler 的初始微服务文档 2、微服务其实就是一种架构风格(服务微化) 3、一个应用应该是一组小型服务 4、可以通过 HTTP 的方式进行互通 5、原先的应用称为单体应用 ==> ALL IN ONE

单体应用微服务 之间的对比图:

微服务之间的相互调用 关系图:

第二章:Spring Boot 中的 Hello World

一、Hello World 环境准备

1、学习前提

学习 Spring Boot 前提:
1、最好学习过 Spring 框架 2、能够使用 Maven 进行项目构建和依赖管理 3、熟悉使用 IDE ===> 如 IDEA 、 Eclipse 或者 STS 等等
环境准备:
1、JDK1.8 ===> Spring Boot 官网推荐 jdk1.7 及以上,个人推荐使用 JDK1.8 或 JDK11 2、Maven3.x ===> maven 3.3 以上版本 3、IntelliJ IDEA ===> 2017年及以上,可使用 2020 版本,支持中文哦 4、Spring Boot 1.5.9.RELEASE ===> Spring Boot 官网推荐 1.5.9 及以上,个人推荐 Spring Boot 2.3.x 以上

2、Maven 配置

找到 Maven 安装目录下 settings.xml 配置文件的 profiles 标签,然后在 profiles 里面添加下面代码:

<!-- 如果你的 JDK 是 1.8 的,那就直接复制;如果你的 JDK 是其他版本的,改一下就行了 -->

<profile>
  <id>jdk-1.8</id>
  <activation>
    <activeByDefault>true</activeByDefault>
    <jdk>1.8</jdk>
  </activation>
  <properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
  </properties>
</profile>

3、IDEA 配置

我们使用 IDEA 开发工具 进行项目的开发,因此需按照 File\settings\build,Execution,Deployment\Build Tools\Maven 路径 给 IDEA 配置好 Maven 。配置项及截图如下:

# 配置好 Maven 的下列三项:

- Maven home directory
- User settings file
- Local repository

二、创建第一个 Spring Boot 应用

现在就使用 Spring Boot 来开发一个小功能:浏览器发送一个 hello 请求 ,服务器接受请求并处理,然后返回相应的结果。 那就开始吧!

1、创建 Maven 项目

新建一个 project 或者 module,选择 Maven ,然后填写相关信息,一直下一步即可 ,直到 Finish 就完成了 Maven 项目的创建。我创建的项目工程名是 001-springboot-helloworld,完成后如下图:

2、导入相关的依赖

打开 Maven 工程下的 pom.xml 文件,把以下代码复制到 pom.xml 文件中:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.1.RELEASE</version>
</parent>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

3、创建主程序

在 Maven 项目的 src\main\java 目录下创建 主程序【HelloWorldApplication】。 注意事项及代码如下:

注意事项:
1、我的包名为 edu.jgsu ,路径是:src\main\java\edu\jgsu 2、HelloWorldApplication 必须放在 jgsu 包里面 3、以后所有包和类必须放在 jgsu 包下面的子包里面,即 jgsu 下面的子包 和 HelloWorldApplication 同级 4、文字描述不够直观,请看下图

package edu.jgsu;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

// @SpringBootApplication 用来标注一个主程序类,说明这是一个 Spring Boot 应用
@SpringBootApplication
public class HelloWorldApplication {
    public static void main(String[] args) {
        // 将 Spring 应用启动起来
        SpringApplication.run(HelloWorldApplication.class, args);
    }
}

4、编写 Controller

edu\jgsu 下面新建一个 Controller 包 ,然后在 Controller 下编写 HelloController 类 。代码如下:

package edu.jgsu.Controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class HelloController {

    // @ResponseBody 注解用于返回字符串,在这个方法中,用于返回【Hello,Spring Boot!】字符串
    // 如果不写这个注解,那么spring boot 就会去 resources 目录下找以【Hello,Spring Boot!】命名的静态页面
    @ResponseBody
    @RequestMapping("/hello")    // 访问路径
    public String Hello() {
        return "Hello,Spring Boot!";
    }

}

5、启动运行

切换到 HelloWorldApplication 主程序类然后运行其主(main)方法 ,最后在浏览器输入如下地址即可。如果能看到以下效果,则代表你的第一个 Spring Boot 应用启动成功了。 如下图:

然后在地址栏后面加上 /hello/hello 来自于 HelloController 类 @RequestMapping 注解 里面的字符串。若成功返回指定字符串,那代表 hello 请求成功了。 如下图:

6、打包部署

添加打包插件 ,把以下代码添加到 pom.xml 文件 </project> 上一行中:

<!-- 这个插件,可以将应用打包成一个可执行的 jar 包 -->
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

选择 Maven ,然后点击 Lifecycle\package 命令即可进行打包。如下图:

打包完成之后,停止 Maven 项目运行,去 Maven 工程目录下找到【target】文件夹,刚刚打包的 jar 包就放在里面 。然后复制到桌面,使用 java -jar xxx.jar 命令来使用 jar 包。这个 jar 包 内嵌 tomcat 应用服务器 ,启动成功后仍然可以通过浏览器访问。如下图:

三、自定义 banner【拓展】

我们启动 spring 项目时,默认的 banner 是这样的,如下:

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 

如果我想把 banner 换成其他的文字可以吗?当然可以,以下是步骤:

# 替换步骤如下:


1、搜索引擎搜索  ==>  spring boot banner
   个人推荐网站  ==>  https://www.bootschool.net/ascii

2、输入自己喜欢的文字,然后生成,最后拷贝结果
   或者点击 ASCll 艺术字,然后寻找到自己喜欢的 banner 并拷贝结果

3、回到 IDEA ,在 src/main/resources/ 下新建 banner.txt 文本,把拷贝结果复制到里面即可

4、重新启动项目,即可看到结果。示例如下
# 我的 banner

////////////////////////////////////////////////////////////////////
//                          _ooOoo_                               //
//                         o8888888o                              //
//                         88" . "88                              //
//                         (| ^_^ |)                              //
//                         O\  =  /O                              //
//                      ____/`---'\____                           //
//                    .'  \\|     |//  `.                         //
//                   /  \\|||  :  |||//  \                        //
//                  /  _||||| -:- |||||-  \                       //
//                  |   | \\\  -  /// |   |                       //
//                  | \_|  ''\---/''  |   |                       //
//                  \  .-\__  `-`  ___/-. /                       //
//                ___`. .'  /--.--\  `. . ___                     //
//              ."" '<  `.___\_<|>_/___.'  >'"".                  //
//            | | :  `- \`.;`\ _ /`;.`/ - ` : | |                 //
//            \  \ `-.   \_ __\ /__ _/   .-` /  /                 //
//      ========`-.____`-.___\_____/___.-`____.-'========         //
//                           `=---='                              //
//      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^        //
//            佛祖保佑       永不宕机     永无BUG                    //
////////////////////////////////////////////////////////////////////


TIPS: 到这里为止,一个 通过 Maven 构建的 Spring Boot 应用 就完成了~~

第三章:Spring Boot 应用剖析和自动配置原理

一、Spring Boot 应用剖析

为什么 Spring Boot 能够如此简单的实现一个 Web 应用?为什么 Spring Boot 不需要配置繁琐的 tomcat 服务器?这就要归功于 Spring Boot 的各种启动器 。先阅读以下依赖并分析:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.1.RELEASE</version>
</parent>

<!-- web 相关依赖:包括 tomcat、dispatcherServlet 和 xml 配置文件等等 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

spring-boot-starter 称之为【场景启动器】,它能够帮我们导入了各种模块正常运行所依赖的组件 。Spring Boot 将所有的功能场景都抽取出来,做成一个个的 【starters(启动器)】,只需要在项目里面引入这些 starter ,那么相关场景的所有依赖都会导入进来 。要用什么功能就导入什么场景的启动器即可。例如要用到【邮件功能】,那就导入【spring-boot-starter-mail】启动器。 要用哪一个版本可参考官网的某一个详细版本。如 Spring Boot-2.12 版本 。那么接下来,我们再来看看下面的依赖:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-dependencies</artifactId>
    <version>2.0.1.RELEASE</version>
    <relativePath>../../spring-boot-dependencies</relativePath>
</parent>

spring-boot-starter-parent 是 spring-boot-starter-web 的父项目 。而 spring-boot-dependenciesspring-boot-starter-parent 的父项目,它才是是真正管理 Spring Boot 应用里面的所有的依赖版本的管理者,也可以称之为 【Spring Boot 的版本仲裁中心】 。以后我们导入依赖,默认是不需要写版本的。【除非没有在 dependencies 里面管理的依赖,才需要声明版本号】

二、Spring Boot 的自动配置原理

我们先来看看 Spring Boot 的主程序类【HelloWorldApplication】,也就是 Spring Boot 应用的入口。 代码如下:

package edu.jgsu;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

// @SpringBootApplication 用来标注一个主程序类,说明这是一个 Spring Boot 应用
@SpringBootApplication
public class HelloWorldApplication {
    public static void main(String[] args) {
        // 将 Spring 应用启动起来
        SpringApplication.run(HelloWorldApplication.class, args);
    }
}

在上述代码中,【@SpringBootApplication】注解是用来说明这个类是 Spring Boot 的主配置类 ,Spring Boot 就应该运行这个类中的 main 方法来启动 Spring Boot 应用 。让我们跟进 【@SpringBootApplication】注解 看一下:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
        @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
    @AliasFor(
        annotation = EnableAutoConfiguration.class
    )
...

【@SpringBootConfiguration】是 Spring Boot 的配置类注解,用于标注在某个类上,表示这是一个 Spring Boot 的配置类 。跟进这个注解,我们又发现了 【@Configuration】注解 ,这个注解用于配置类,是 Spring 底层注解。

注意: Spring Boot 中的配置类和 Spring 中的配置文件是等价的

继续跟进 【@Configuration】注解 ,我们又发现了 【@Component】注解 。具体如下:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {
    @AliasFor(annotation = Component.class)
    String value() default "";
    ……
}

【@Component】注解 表示配置类也是容器中的一个组件,都会交给 Spring 进行统一管理。那么到此为止,【@SpringBootConfiguration】注解 就说完了。那么接下来说一下 【@EnableAutoConfiguration】注解 的作用。


在学习 Spring Boot 之前,我们需要 手动配置 的很多东西。那么现在,Spring Boot 会帮我们进行自动配置。【@EnableAutoConfiguration】这个注解的作用就是告诉 Spring Boot 开启自动配置功能,这样自动配置才能生效。 跟进这个注解:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
    String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
...

在上面代码中,有两个注解很重要,分别是 【@AutoConfigurationPackage】 注解和【@Import】注解 。那就先来说一下 【@AutoConfigurationPackage】这个注解 。该注解的作用就是 自动配置包,将主配置类(@SpringBootApplication 标注的类)的所在包及下面所有子包里面的所有组件扫描到 Spring 容器


举个例子:如果把上面 Controller 包下面的 HelloController 类剪切到 edu 包下, 此时这个类不在扫描的范围之内,那么 HelloController 类将无法被访问。所以当我们访问 /hello 时,浏览器会返回 404 页面。 那么接下来,我们跟进 【@AutoConfigurationPackage】 这个注解看一下:

Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import(AutoConfigurationPackages.Registrar.class)
public @interface AutoConfigurationPackage {
}

这是我们发现了一个 Spring 的底层注解 【@Import】 ,该注解的作用时给容器中导入一个组件,导入的组件为AutoConfigurationPackages.Registrar.class 。进一步的源码也就不分析了,到这里就差不多了【其实是博主水平有限,只能到这了,哈哈】。


那么到这里为止,我们已经清楚了【自动配置注解的功能】,其功能就是给容器中导入非常多的自动配置类【xxxAutoConfiguration】,就是给容器中导入某个场景需要的所有组件,并配置好这些组件 。有了自动配置类,也就免去了我们手动编写配置注入功能组件等相关工作。


Spring Boot 在启动一个应用的过程中,它会从【类路径下】的 META-INF/spring.factories 文件中获取【@EnableAutoConfiguration】注解所指定的值 ,将这些值作为自动配置类导入到容器中,自动配置类就生效,从而帮我们进行自动配置工作。以前我们需要自己配置的东西,现在这些自动配置类都帮我们配置好。

TIPS: J2EE 的整体整合解决方案和自动配置都在 spring-boot-autoconfigure-2.0.1.RELEASE.jar

三、快速创建 Spring Boot 应用

上述的 Hello World 使用的时 Maven 进行构建,那么现在学习一种新的构建 Spring Boot 的方式,那就是使用 Spring Initializr 来快速创建 Spring Boot 应用。具体操作往下看!


首先 ,我们新建一个模块或者工程,选择左边的 Spring Initializr ,然后点击下一步,如下图:

然后填好相关信息,点击下一步 ,此刻进入到 依赖选择页面 ,选择好你要依赖,例如你要做 Web 开发,那么你就选择左侧的 Web ,中间选择你要的依赖,我选的是 Spring Web 。如果你还要用到数据库,那就选择数据库相关的即可。下图仅供参考:

选择好以后,点击完成即可。这里要注意:选择我们需要的模块之后,向导会联网创建 Spring Boot 项目【一定要联网】。创建完成之后项目结构如下图。然后自己编写 Controller 类,再去浏览器访问 ,这里就不在赘述了。

项目创建成功后,默认生成的内容有哪些呢?如下:

# 默认生成的内容如下:

1、主程序 Application 已经生成好了,我们只需要编写业务逻辑即可

2、resources 文件夹中目录结构
    1、static ==> 保存所有的静态资源 ==> 如 js、css、images 等等
    2、templates ==> 保存所有的模板页面
    3、application.properties ==> Spring Boot 应用的配置文件,可以修改一些默认设置

3、Spring Boot 的 jar 包使用嵌入式的 Tomcat,默认不支持 JSP 页面,所以要使用模板引擎(freemarker、thymeleaf)
  • 文章作者:root
  • 创建时间:2020-02-23 22:05:08
  • 更新时间:2022-01-06 22:05:08
  • 版权声明:本文为博主原创文章,未经博主允许不得转载!
请 在 评 论 区 留 言 哦 ~~~
1024