搭建简单的 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-parent
和 spring-boot-starter-web
spring-boot-starter-web
这个 web 启动器引入了 tomcat 相关的包:
-
tomcat-embed-core-9.0.43.jar
-
tomcat-embed-websocket-9.0.43.jar
-
spring-boot-starter-tomcat-2.3.9.RELEASE.jar
,这就是 SpringBoot 自带的 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 thetarget
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(项目初始化向导)
小节