SpringBoot起步——从Demo工程开始

293 阅读4分钟

还记得多年前刚接触编程时,学习的第一步就是创建HelloWorld程序,当控制台输出“Hello World”的那一刻,瞬间就感觉到“会了,嗯,我学会了”,为了重温当年那一刻,今天我们也从SpringBoot的HelloWorld开始。

1 准备代码工程

相信在读的各位已经不是java小白了,直接创建如图所示的代码工程

工程中其实只涉及三个文件,分别的作用及代码如下:

  • pom.xml,添加启动SpringBoot的一些必需依赖
<?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">
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.10</version>
    </parent>

    <modelVersion>4.0.0</modelVersion>
    <groupId>com.letterh</groupId>
    <artifactId>demo</artifactId>
    <version>1.0.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>
  • DemoApplication类,作为SpringBoot的主启动类
package com.letterh.demo;

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

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class);
    }

}
  • TestController类,方便验证SpringBoot是否启动成功
package com.letterh.demo.controller;

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

@Controller
public class TestController {

    @ResponseBody
    @RequestMapping("/hello")
    public String test() {
        return "Hello, spring boot";
    }
}

2 启动运行

直接执行DemoApplication的main方法即可,控制台日志正常输出,一个没有任何功能的spring-boot工程就启动起来了。打开浏览器访问localhost:8080/hello,验证SpringBoot工程的Rest接口如期运行。

3 问题思考

到了这里,可以恭喜自己又学会了SpringBoot。然后冷静思考一下,面对这个简单的小程序,能不能强行问出一些问题呢?也许这些问题才是这个简单似划水的小节中最有价值的存在了

3.1 首先看pom文件

3.1.1 parent指定spring-boot-starter-parent是干嘛用的?

先说答案,spring-boot-starter-parent作用主要有:

  • 继承spring-boot-dependencies,管理依赖版本
  • 定义了application*.yml(/properties/yaml)的资源文件过滤
  • 定义了java编译版本
  • 使用UTF-8编码
  • 管理插件配置

所以,如果不继承这个parent的话,最大的影响就是pom编写引入相关依赖时,要手动指定版本号,代码工程比较复杂时,很容易会面临各种版本冲突问题。

如果你不关注这个问题的回答过程,可以跳过这里,继续看3.1.2,否则我们直接打开parent pom文件,去除干扰项并保留关键信息后,可以看到spring-boot-starter-parent的内容主要有:

  • 继续引入了父pom:spring-boot-dependencies,进一步深入spring-boot-dependencies查看,发现其主要是配置了dependencyManagement和pluginManagement,实际就是做了一些依赖版本管理

  • 指定一些properties:java、maven版本号信息,一些字符编码信息等等

  • 配置了resources:对application配置文件配置了变量替换(filtering表示是否进行变量替换)

3.1.2 为什么依赖的是spring-boot-starter-web?

先说答案,spring-boot-starter-web中整合了启动SpringBoot Web项目所必需的一些依赖,使得开发者无需关心究竟要引入哪些具体依赖项。

同样,只需点开spring-boot-starter-web pom文件查看就可以知道它自动帮我们引入了哪些依赖

3.1.3 spring-boot-maven-plugin又是啥?

先说答案,在SpringBoot项目中,框架通过spring-boot-maven-plugin提供了一套自己的打包机制。可以在MAVEN的生命周期package后重新打包,生成新的JAR包。spring-boot-maven-plugin插件将SpringBoot的项目打包成FAT-JAR,也就是说将项目启动运行所需要的JAR都包含进来了。

再看过程,我分别在引入和移除该插件情况下执行了mvn package,将打包的产物解压后对比查看

不难发现,使用plugin后,把我们的类(com)换了一个目录存放,同时还多了SpringBoot相关的类(org)及项目所需的一些jar包(lib)。

亲自操作了一遍的读者可能还会发现,使用plugin打包后,打包产物中还多了一个名为*.jar.original的东西,这是什么呢?

打开继承的spring-boot-starter-parent pom文件,可以找到其中也定义了spring-boot-maven-plugin,并且比我们自己定义的还多了一个repackage,顾名思义,使用插件的打包比普通打包多的就是这个repackage过程,普通打包产物被重命名为了.original文件。

3.2 其次看DemoApplication类

为什么要加SpringBootApplication注解?main方法中执行的run方法是什么?这个问题就涉及到了spring-boot的核心原理,在后面的章节中就开始逐个分析。