从零到一学习 Spring Boot。本教程涉及的知识如下:
Hell World
注解的使用
依赖讲解
配置文件
YAML
配置文件讲解
Profifile模式
配置文件优先级外部配置加载顺序
自动配置原理
日志处理
日志框架介绍
SLF4j的使用
日志关系
日志的使用
Web实战
创建项目
静态资源映射规则
模板引擎
Thymeleaf使用
Thymeleaf语法
Spring MVC自动配置
扩展 Spring MVC
错误处理机制
定制错误页面
Servlet容器
三大组件介绍
修改容器
Docker
数据访问
...
Spring Boot 教程
一、Hello World
1. 起步
1. 点击此链接点击Quick start,选择对应版本,下载Demo。
2. IDEA导入项目
3. 建立controller包,以及类package com.wrq.boot.controller;
@Controller
public class HelloController {
@ResponseBody
@RequestMapping("/hello")
public String hello(){
return "hello world!";
}
}
4. 在于controller包同级有一个主程序类
package com.wrq.boot;
@SpringBootApplication
public class BootApplication {
public static void main(String[] args) {
//应用启动起来
SpringApplication.run(BootApplication.class, args);
}
}
@SpringBootApplication 来标注一个主程序,说明这是一个Sping Boot项目
5. 运行这个main方法,控制台打印启动成功。

:: Spring Boot :: (v1.5.19.BUILD-SNAPSHOT)2019-01-14 00:35:00.020 INFO 18196 --- [ main]
com.wrq.boot.BootApplication : Starting BootApplication
on DESKTOP-IJ41H0K with PID 18196 (D:\Java\Project\Spring-Boot-
Notes\boot\target\classes started by wangqian in
D:\Java\Project\Spring-Boot-Notes\boot)
2019-01-14 00:35:00.026 INFO 18196 --- [ main]
com.wrq.boot.BootApplication : No active profile set,
falling back to default profiles: default
2019-01-14 00:35:00.203 INFO 18196 --- [ main]
ationConfigEmbeddedWebApplicationContext : Refreshing
org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWeb
ApplicationContext@e50a6f6: startup date [Mon Jan 14 00:35:00 CST
2019]; root of context hierarchy
2019-01-14 00:35:04.984 INFO 18196 --- [ main]
s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with
port(s): 8081 (http)
2019-01-14 00:35:05.048 INFO 18196 --- [ main]
o.apache.catalina.core.StandardService : Starting service [Tomcat]
2019-01-14 00:35:05.048 INFO 18196 --- [ main]
org.apache.catalina.core.StandardEngine : Starting Servlet Engine:
Apache Tomcat/8.5.37
2019-01-14 00:35:05.396 INFO 18196 --- [ost-startStop-1] o.a.c.c.C.
[Tomcat].[localhost].[/] : Initializing Spring embedded
WebApplicationContext
2019-01-14 00:35:05.396 INFO 18196 --- [ost-startStop-1]
o.s.web.context.ContextLoader : Root
WebApplicationContext: initialization completed in 5205 ms
2019-01-14 00:35:05.880 INFO 18196 --- [ost-startStop-1]
o.s.b.w.servlet.ServletRegistrationBean : Mapping servlet:
'dispatcherServlet' to [/]
2019-01-14 00:35:05.890 INFO 18196 --- [ost-startStop-1]
o.s.b.w.servlet.FilterRegistrationBean : Mapping filter:
'characterEncodingFilter' to: [/*]
2019-01-14 00:35:05.891 INFO 18196 --- [ost-startStop-1]
o.s.b.w.servlet.FilterRegistrationBean : Mapping filter:
'hiddenHttpMethodFilter' to: [/*]
2019-01-14 00:35:05.891 INFO 18196 --- [ost-startStop-1]
o.s.b.w.servlet.FilterRegistrationBean : Mapping filter:
'httpPutFormContentFilter' to: [/*]2019-01-14 00:35:05.892 INFO 18196 --- [ost-startStop-1]
o.s.b.w.servlet.FilterRegistrationBean : Mapping filter:
'requestContextFilter' to: [/*]
2019-01-14 00:35:06.666 INFO 18196 --- [ main]
s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for
@ControllerAdvice:
org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWeb
ApplicationContext@e50a6f6: startup date [Mon Jan 14 00:35:00 CST
2019]; root of context hierarchy
2019-01-14 00:35:06.854 INFO 18196 --- [ main]
s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/hello]}" onto
public java.lang.String
com.wrq.boot.controller.HelloController.hello()
2019-01-14 00:35:06.863 INFO 18196 --- [ main]
s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error]}" onto
public
org.springframework.http.ResponseEntity<java.util.Map<java.lang.Strin
g, java.lang.Object>>
org.springframework.boot.autoconfigure.web.BasicErrorController.error
(javax.servlet.http.HttpServletRequest)
2019-01-14 00:35:06.865 INFO 18196 --- [ main]
s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "
{[/error],produces=[text/html]}" onto public
org.springframework.web.servlet.ModelAndView
org.springframework.boot.autoconfigure.web.BasicErrorController.error
Html(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpSer
vletResponse)
2019-01-14 00:35:06.946 INFO 18196 --- [ main]
o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path
[/webjars/**] onto handler of type [class
org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2019-01-14 00:35:06.946 INFO 18196 --- [ main]
o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**] onto
handler of type [class
org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2019-01-14 00:35:07.009 INFO 18196 --- [ main]
o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path
[/**/favicon.ico] onto handler of type [class
org.springframework.web.servlet.resource.ResourceHttpRequestHandler]2019-01-14 00:35:07.278 INFO 18196 --- [ main]
o.s.j.e.a.AnnotationMBeanExporter : Registering beans for JMX
exposure on startup
2019-01-14 00:35:07.347 INFO 18196 --- [ main]
s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s):
8080(http)
2019-01-14 00:35:07.357 INFO 18196 --- [ main]
com.wrq.boot.BootApplication : Started BootApplication in
8.343 seconds (JVM running for 9.312)
启动成功:访问 http://localhost:8081/hello 即可打印 hello world!
上方日志显示服务器端口等信息,默认是8080,可以在application.properties配置文件
中修改默认端口号:
#修改端口
server.port=8081
可以修改HelloController:
@RestController
public class HelloController {
@RequestMapping("/hello")
public String hello(){
return "hello world!";
}
}
上方Controller等于下方的:2. 注解区别?
@Controller和@RestController的区别
@RestController注解相当于@ResponseBody + @Controller合在一起的作用。
1. 如果只是使用@RestController注解Controller,则Controller中的方法无法返回jsp页
面,或者html,配置的视图解析器 InternalResourceViewResolver不起作用,返回
的内容就是Return 里的内容。
2. 如果需要返回到指定页面,则需要用 @Controller配合视图解析器
InternalResourceViewResolver才行。 如果需要返回JSON,XML或自定义
mediaType内容到页面,则需要在对应的方法上加上@ResponseBody注解。
例如:
1.使用@Controller 注解
在对应的方法上,视图解析器可以解析return 的jsp,html页面,并且跳转到相应页面
若返回json等内容到页面,则需要加@ResponseBody注解
2.@RestController注解
相当于@Controller+@ResponseBody两个注解的结合。
返回json数据不需要在方法前面加@ResponseBody注解了
使用@RestController这个注解,就不能返回jsp,html页面,视图解析器无法解析
jsp,html页面
3. 依赖讲解
1. 父项目(版本仲裁)
@ResponseBody
@Controller
public class HelloController {
@RequestMapping("/hello")
public String hello(){
return "hello world!";
}
}<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.19.BUILD-SNAPSHOT</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
你可以 spring-boot-starter-parent 点进去,就会发现它还有父项目。
它可以看成一个版本的仲裁中心,我们所配置的依赖不需要说明版本,因为仲裁中心
已经说明了
如果中心没有声明的,必须说明版本
2. 基础依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
spring-boot-starter:spring boot场景启动器
Spring把每个场景都抽取出来,做成了一个个starts
如我们需要那个场景只需要把对应的启动器来导入进来就可以,不用担心版本。
用什么功能(Web、缓存、kafka等等)导入相关启动器即可
3. 、Web模块相关依赖
<!--添加这个依赖,@ResponseBody @RequestMapping-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
4. 配置文件处理器
<!--绑定配置文件处理器,配置文件进行绑定的时候就会有提示-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
5. 打包插件
<!-- 将应用打包成一个可执行Jar包,直接使用java -jar xxxx的命令来执行 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>