不是对Spring做了改进或提升,而是提供了快速使用Spring的方法。
<!--SpringBoot提供了很多场景的启动器>
一.快速入门
搭建SpringBoot工程,定义helloController.hello()方法,返回“hello SpringBoot”。实现步骤:
1.创建Maven项目
2.导入SpringBoot起步依赖
3.定义Controller
package com.example.helloworld.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController //等于@Controller + @ResponseBody
@RequestMapping("/hello")
public class HelloController {
@RequestMapping("/world")
public String hello(){
return "hello World!";
}
}
4.编写引导类
package com.example.helloworld;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class HelloworldApplication {
public static void main(String[] args) {
SpringApplication.run(HelloworldApplication.class, args);
}
}
二.代码解释
2.1 @RestController和@RequestMapping
@RestController是个混合注解,扫描 + 将方法返回值当成输出返回给浏览器,在类里面就不需要再用@responsebody了,=@Controller + @ReponseBody。
它为阅读代码的人和Spring提供了提示,说明这个类扮演了一个特定的角色。 在本例中,我们的类是一个web @Controller
,所以Spring考虑使用它来处理客户端的web请求,并告诉Spring将返回的结果字符串直接响应给客户端。
@RequestMapping
注解提供了 “routing” (路由)信息。 它告诉Spring,任何带有 /
路径的HTTP请求都应该被映射到 home
方法。
@RestController 和 @RequestMapping 注解是Spring MVC注解(它们不是Spring Boot特有的) |
2.2 @SpringBootApplication
@SpringBootApplication
被称为元注解,它结合了 @SpringBootConfiguration
、@EnableAutoConfiguration
和 @ComponentScan
。
@EnableAutoConfiguration
告诉Spring Boot根据你添加的jar依赖项 "猜测" 你想如何配置Spring。由于 spring-boot-starter-web
添加了Tomcat和Spring MVC,自动配置会假定你正在开发一个Web应用,并相应地设置Spring。
2.3 “main” 方法
我们应用程序的最后部分是 main
方法。 这是一个标准的Java入口方法,也就是应用的启动方法。 我们的main方法通过调用 run
方法,把应用委托给Spring Boot的 SpringApplication
类。 SpringApplication
引导我们的应用程序启动Spring,而Spring又会启动自动配置的Tomcat网络服务器。 我们需要将 HelloworldApplication.class
作为参数传递给 run
方法,以告诉 SpringApplication
哪个是主要的Spring组件。 args
数组也被传入,这是命令行参数。
是一种元注释,可以拉动组件扫描、自动配置和属性支持。本质上,它将点燃一个servlet容器并提供服务。
三.RESTful接口
HTTP接口调用是一种基于HTTP协议的远程调用方式,可以通过URL进行调用,适用于不同编程语言之间的调用。而RESTful调用是一种基于REST架构风格的远程调用方式,是HTTP接口调用的一种特殊实现,只是HTTP接口调用不一定要遵循RESTful的设计原则。
3.1 与HTTP调用的区别
- URL表达形式不同:
RESTful调用的URL表达形式必须遵循RESTful架构风格的URL格式规范。 HTTP接口调用的URL表达形式可以不遵循任何标准格式。
- 请求方法不同
RESTful调用只能使用GET、POST、PUT、DELETE四种HTTP请求方法。
- 资源定义不同
HTTP接口调用不依赖于任何具体的资源定义。 RESTful调用的资源和API请求对应,需要在URL中对资源进行定义。
3.2 RESTful调用的特点:
- 资源标准化:RESTful是基于HTTP协议的,HTTP协议定义的URL必须是符合URI(Uniform Resource Identifier)标准的标识符。URI由协议、主机、资源路径、查询字符串和片段组成。故而RESTful要求每个资源都有一个唯一的标识符URI。
- 无状态:因为HTTP是一种无状态协议,所以RESTful也是“无状态”的。即服务器不会保存任何客户端请求的历史信息。每个请求都是独立的,服务器不会在请求之间保留会话状态以便将来使用(如TCP连接常见的使用形式——WebSocket,当连接断开就不能使用,这种连接称为有状态的)。
- 缓存机制:由于RESTful是基于HTTP标准定义的,因此具有HTTP缓存机制。客户端可以在收到数据后将其存储在本地缓存中,在下一次请求相同资源时可以减少网络传输,提高性能。
总之,RESTful是HTTP接口调用的一种特殊实现,遵循REST架构风格的规范,能够提供更加标准化、统一化、可读性和易用性的API设计。RESTful调用相对于HTTP接口调用来说,具有更加清晰明了、易于理解和维护的API设计,扩展性和灵活性也更强。
四.HATEOAS
HATEOAS(Hypermedia as the Engine of Application State):超媒体作为应用状态引擎。是一种创建自描述API的方式。在API做返回的资源中会包含相关资源的链接, 客户端只需要了解最少的 API URL信息就能导航整个API。
是 REST 架构风格中最复杂的约束,也是构建成熟 REST 服务的核心。它的重要性在于打破了客户端和服务器之间严格的契约,使得客户端可以更加智能和自适应,而 REST 服务本身的演化和更新也变得更加容易。
Richardson 提出了REST一种 成熟度模型,我们称之为Richardson Maturity Model,这种模式将REST按照成熟度划分为4个等级
- Level0:使用HTTP作为WEB服务的传输方式,以REST样式公开SOAP Web服务
- Level1:使用适当的URI(使用名词)公开资源,这种方式提出了资源的概念
- Level2:资源使用正确的URI + HTTP方法,比如更新用户就用put方式,查询用get方式
- Level3:使用HATEOAS(作为应用程序状态引擎的超媒体),在资源的表达中包含了链接信息,客户端可以在链接信息中发现可以执行的操作
从上述 REST 成熟度模型中可以看到,使用 HATEOAS 的 REST 服务是成熟度最高的,也是推荐的做法。对于不使用 HATEOAS 的 REST 服务,客户端和服务器的实现之间是紧密耦合的。客户端需要根据服务器提供的相关文档来了解所暴露的资源和对应的操作。当服务器发生了变化时,如修改了资源的 URI,客户端也需要进行相应的修改。而使用 HATEOAS 的 REST 服务中,客户端可以通过服务器提供的资源的表达来智能地发现可以执行的操作。当服务器发生了变化时,客户端并不需要做出修改,因为资源的 URI 和其他信息都是动态发现的。