搭建简单的 SpringBoot 应用

搭建简单的 SpringBoot 应用

官方文档

官方文档

系统要求:jdk1.8 及以上,Maven 3.3+

实际操作

IDEA 创建 JavaSE 模块

最终创建出类似于下图的结构

如果不需要 Main 类,删掉即可

以后直接使用 Spring Initailizr 来搭建项目

《SpringBoot 基础篇 -4- 开发小技巧.md》中的 Spring Initailizr 小节

编辑 POM

在 pom.xml 中添加父依赖

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

如果想要搭建 Web 项目,再添加相应的启动器依赖,如果是搭建 JavaSE 项目,则不用添加此依赖

<dependencies>
    <!-- 引入Web相关的依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

主要引入了 spring-boot-starter-parentspring-boot-starter-web

spring-boot-starter-web 这个 web 启动器引入了 tomcat 相关的包:

创建 Main 类

在程序主目录添加类 MainApplication,主要是添加注解 @SpringBootApplication@SpringBootApplication 告诉我们当前类是一个 SpringBoot 应用,这个类是一个主程序类,这个类的 main 方法就是启动的入口,通过 SpringApplication.run() 启动 Spring 应用

/**
 * 主程序类
 * @SpringBootApplication:这是一个SpringBoot应用
 */
@SpringBootApplication
public class MainApplication {

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

编写 Web 项目的业务代码

主要是 SpringMVC 相关的业务代码,之前在 SpringMVC 中怎么写,现在依然怎么写

xyz.xiashuo 包下新建 controller 包,然后新建 HelloController

@RestController
@RequestMapping(value = "/Hello")
public class HelloController {

    // http://localhost:8888/SpringBoot-Basic/Hello/sayHello
    @RequestMapping("/sayHello")
    public String sayHello() {
        return "Hello, Spring Boot 2!";
    }

}

实践

直接运行 MainApplication,控制台直接输出日志

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.3.4.RELEASE)

2022-10-09 15:10:49.256  INFO 25704 --- [           main] xyz.xiashuo.MainApplication              : Starting MainApplication on LAPTOP-LK with PID 25704 (E:\IDEAProject\SpringBoot\SpringBoot-Basic\target\classes started by wwwli in E:\IDEAProject\SpringBoot)
2022-10-09 15:10:49.257  INFO 25704 --- [           main] xyz.xiashuo.MainApplication              : No active profile set, falling back to default profiles: default
2022-10-09 15:10:49.665  INFO 25704 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2022-10-09 15:10:49.669  INFO 25704 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2022-10-09 15:10:49.669  INFO 25704 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.38]
2022-10-09 15:10:49.712  INFO 25704 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2022-10-09 15:10:49.712  INFO 25704 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 434 ms
2022-10-09 15:10:49.784  INFO 25704 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2022-10-09 15:10:49.851  INFO 25704 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2022-10-09 15:10:49.856  INFO 25704 --- [           main] xyz.xiashuo.MainApplication              : Started MainApplication in 0.738 seconds (JVM running for 1.306)

可以看到启动速度非常快,

Started MainApplication in 0.738 seconds (JVM running for 1.306)

其中,内置的 Tomcat,默认监听端口为 8080,应用上下文为空字符串

catWebServer : Tomcat started on port(s): 8080 (http) with

同时还启动了一个线程池,这些都是默认就有的

Initializing ExecutorService 'applicationTaskExecutor'

直接访问 http://localhost:8080/Hello/sayHello,返回

Hello, Spring Boot 2!

如果在 POM 中未引入 spring-boot-starter-web,启动日志就会更简单。

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.3.4.RELEASE)

2022-10-11 09:30:55.002  INFO 33476 --- [           main] xyz.xiashuo.MainApplication              : Starting MainApplication on LAPTOP-LK with PID 33476 (E:\IDEAProject\SpringBoot\SpringBoot-IOC\target\classes started by wwwli in E:\IDEAProject\SpringBoot)
2022-10-11 09:30:55.003  INFO 33476 --- [           main] xyz.xiashuo.MainApplication              : No active profile set, falling back to default profiles: default
2022-10-11 09:30:55.220  INFO 33476 --- [           main] xyz.xiashuo.MainApplication              : Started MainApplication in 0.356 seconds (JVM running for 0.946)

自定义配置

src/main/resources 下新建 application.properties,然后添加配置

application.properties 可以在 src/main/resources 下的路径中,比如 src/main/resources/config

# 应用的上下文路径
server.servlet.context-path=/SpringBoot-Basic
# 当前应用所在的Web服务器监听的本地端口
server.port=8888

再次运行 MainApplication,启动日志如下,可以发现,Tomcat 的启动端口改成了 8888,同时应用上下文路径为 /SpringBoot-Basic

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.3.4.RELEASE)

2022-10-09 15:19:18.293  INFO 36140 --- [           main] xyz.xiashuo.MainApplication              : Starting MainApplication on LAPTOP-LK with PID 36140 (E:\IDEAProject\SpringBoot\SpringBoot-Basic\target\classes started by wwwli in E:\IDEAProject\SpringBoot)
2022-10-09 15:19:18.294  INFO 36140 --- [           main] xyz.xiashuo.MainApplication              : No active profile set, falling back to default profiles: default
2022-10-09 15:19:18.705  INFO 36140 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8888 (http)
2022-10-09 15:19:18.709  INFO 36140 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2022-10-09 15:19:18.709  INFO 36140 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.38]
2022-10-09 15:19:18.752  INFO 36140 --- [           main] o.a.c.c.C.[.[.[/SpringBoot-Basic]        : Initializing Spring embedded WebApplicationContext
2022-10-09 15:19:18.752  INFO 36140 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 436 ms
2022-10-09 15:19:18.824  INFO 36140 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2022-10-09 15:19:18.895  INFO 36140 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8888 (http) with context path '/SpringBoot-Basic'
2022-10-09 15:19:18.899  INFO 36140 --- [           main] xyz.xiashuo.MainApplication              : Started MainApplication in 0.75 seconds (JVM running for 1.288)
2022-10-09 15:19:24.578  INFO 36140 --- [nio-8888-exec-1] o.a.c.c.C.[.[.[/SpringBoot-Basic]        : Initializing Spring DispatcherServlet 'dispatcherServlet'
2022-10-09 15:19:24.578  INFO 36140 --- [nio-8888-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2022-10-09 15:19:24.581  INFO 36140 --- [nio-8888-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 3 ms

访问 http://localhost:8080/Hello/sayHello,返回

Hello, Spring Boot 2!

SpringBoot 将来会整合各种各样的组件,比如批处理,比如 Mybatis 之类的,而 SpringBoot 也为这些组件提供了默认的配置,这也是为什么我们不进行任何配置就可以直接启动一个 Web 服务,当我们需要自定义某些配置的时候,我们就需要在 application.properties 中添加,所有组件的自定义配置都集中在这一个配置文件中,而且名字固定为 application.properties

那到底 SpringBoot 到底提供了哪些默认配置,这些默认配置的默认值又是什么,参考 Application Properties注意版本

简化部署

不再需要打成 war 包,放到 Tomcat 中。

在 pom 文件中添加构建配置

<build>
    <plugins>
        <!-- 将当前应用打包成一个可执行的jar包,如果是web项目,则打出的包中自带了Tomcat,可直接通过 java -jar 运行,非常方便  -->
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

然后直接通过 mvn package 打包,或者直接点击

打包之后,直接通过 java -jar 运行 jar 包

甚至你可以直接双击 Jar 包运行

访问 http://localhost:8888/SpringBoot-Basic/Hello/sayHello

Hello, Spring Boot 2!

之前,我们要导入 Spring,Spring MVC 的依赖,还得整合这两俩,然后开始写业务代码,写完之后还得打成 war 包部署到 tomcat 中,现在通过 SpringBoot 直接就打成 ja 包就可以运行了,真的牛逼!


使用 spring-boot-maven-plugin 构建插件,创建一个可执行 jar 包,jar 包里面包含了 tomcat,也就是说运行 jar 包就可以启动项目

打包之后会有两个文件,jar 和 jar.original 包

You should also see a much smaller file named myproject-0.0.1-SNAPSHOT.jar.original in the target directory. This is the original jar file that Maven created before it was repackaged by Spring Boot.

original 包是 maven 最开始自己打出的还没被 Spring Boot 再次打包的包,也就是说 jar 是 jar.original 封装之后的包,

打出来的 jar 包中,主要的资源都在 BOOT-INF 文件夹下,jar.original 包和 jar 包最大的区别就是:jar.original 包不包含依赖的第三方 jar 文件而 jar 包中带有运行所需的所有的 jar 文件,这是 jar 包这么大的原因,当然也正因为包含了依赖的第三方 jar 文件,jar 包可以直接 java -jar 运行

总结

SpringBoot 在简化配置和简化部署方面是非常出色的。同时跟之前编写的 Spring 或者 SpringMVC 的代码无缝兼容,真的非常方便。

经过了简单的配置,就可以跑起来一个 SpringBoot 应用,对于我这样使用了很久的 SpringMVC 的人来说,效果让人惊叹!

进一步简化

在对 SpringBoot 的基本原理有了一定的了解之后,我们可以直接通过 Spring Initailizr 来创建项目

具体操作看《SpringBoot 基础篇 -4- 开发小技巧.md》的 Spring Initailizr(项目初始化向导) 小节