大家好,欢迎来到IT知识分享网。
一、spring boot 概述
1、简介
Spring boot 的前身是Spring mvc,很多的概念也来源于Spring mvc,Spring boot最主要的变化就是约定优于配置,无需进行繁琐的xml配置,开箱即用。
Spring boot 基于Spring框架,Spring框架提供了一系列的解决方案,利用控制反转的特性,并通过依赖注入实现控制反转来实现管理对象生命周期容器化;利用面向切面编程进行声明式的事务管理;整合多种持久化技术管理数据访问,提供大量优秀的Web框架方便开发等等。Spring集成多种事务模板,系统可以通过事务模板、XML或Java注解进行事务配置,并且事务框架集成了消息传递和缓存等功能。
2、特性
1)Create stand-alone Spring applications,可创建独立的Spring程序
2)Embed Tomcat, Jetty or Undertow directly (no need to deploy WAR files),
内嵌Tomcat、Jetty、Undertow等Servlet容器,无需打包war
3)Provide opinionated ‘starter’ dependencies to simplify your build configuration,提供自动配置的“starter”依赖简化项目配置,“starter”提供关联的相应配置
4)Automatically configure Spring and 3rd party libraries whenever possible,自动化Spring 配置和三方库。
5)Provide production-ready features such as metrics, health checks, and externalized configuration,提供准备好的特性,如指标、健康检查和外部化配置
6)Absolutely no code generation and no requirement for XML configuration,绝对无代码生成,不需要XML配置
二、spring boot 注释
在说具体功能前,需先配置好开发环境,如java,maven等环境支持,另外需准备好开发工具,如eclipse,idea等,如需设置代码库,需安装git,svn等工具。
1、项目的启动注释
Spring boot有个核心注解@SpringBootApplication,主要作用是开启Spring 自动配置,如果在 Application 类上去掉该注解,那么不会启动 SpringBoot程序。
2、@Controller
@Controller 注解在类上,表示控制器对象。
@RestController 注解在类上,是 @Controller 和 @ResponseBody 的组合注解,直接返回JSON/XML 等序列化结果。
目前主流的架构,都是前后端分离的架构,后端只需提供 API 接口,返回数据即可。因此,现在项目基本使用@RestController 注解。
3、@RequestMapping
@RequestMapping 注解在类或方法上,标记该类/方法对应接口的配置信息。
如:@RequestMapping(value = “/test/add”,method=”POST”)
一般Spring 还提供分解的各类方法:
@GetMapping 注解:对应 @GET 请求方法的 @RequestMapping 注解。
@PostMapping 注解:对应 @POST 请求方法的 @RequestMapping 注解。
@PutMapping 注解:对应 @PUT 请求方法的 @RequestMapping 注解。
@DeleteMapping 注解:对应 @DELETE 请求方法的 @RequestMapping 注解。
…
请求:
对应的接口:
这里要注意下restful api的规范,可参考github api。
API地址:https://example.com/api/v1
接口地址:
/users/:username/repos
/users/:org/repos
/repos/:owner/:repo
/repos/:owner/:repo/tags
/repos/:owner/:repo/branches/:branch
4、@RequestParam,@PathVariable
@RequestParam 注解在方法参数上,标记该方法参数对应的请求参数的信息。
两者不同的是@RequestParam 是从request里面拿取值,而 @PathVariable 是从一个URI模板里面来取。
栗子:
@PathVariable 形如:http://host:port/path/{参数值} 请求:http://localhost/test1/id/name 接口: @RequestMapping("test1/{id}/{name}") public String testPathVariable(@PathVariable String id, @PathVariable String name) { return "id=" + id + ", name=" + name; }
@RequestParam
形如:http://host:port/path/{参数值}
请求:http://localhost/test2?id=id&name=name
接口:
@RequestMapping("test2") public String testRequestParam(@RequestParam("id") String id, @RequestParam("name") String name) { return "id=" + id + ", name=" + name; }
三、spring boot 全局返回
后端 API 给前端需提供统一的返回结果,如果每个人都单独写,不便于管理。于是返回AjaxResult方法(源于ruoyi框架)。
网上还有一种方案,增加 @ControllerAdvice 接口,实现 ResponseBodyAdvice 接口,对相关的controller进行拦截,封装成类AjaxResult类。其实应该controller类都应该返回类AjaxResult方法。
四、spring boot全局异常处理
通常一个web框架中,有大量需要处理的异常。比如业务异常,权限不足等等。前端通过弹出提示信息的方式告诉用户出了什么错误。 通常情况下我们用try…..catch…. 对异常进行捕捉处理,但是在实际项目中对业务模块进行异常捕捉,会造成代码重复和繁杂,我们希望代码中只有业务相关的操作,所有的异常我们单独设立一个类来处理它。全局异常就是对框架所有异常进行统一管理。 我们在可能发生异常的方法里throw抛给控制器。然后由全局异常处理器对异常进行统一处理。 如此,我们的Controller中的方法就可以很简洁了。
1、全局异常处理类
通过@RestControllerAdvice对所有的controller进行处理(来于ruoyi)。Controller层只要抛出异常即可。此处用@RestControllerAdvice,这样方法上就可以不需要添加@ResponseBody。
2、测试类
Service,mapper层的异常都往上抛,抛到controller层,controller层处理异常。当我们访问接口会发生LoginException业务逻辑异常,按照之前的全局异常配置以及统一返回实体实例化,访问后会出现AjaxResult格式JSON数据。
五、spring boot过滤器、拦截器、监听器
日志拦截器,记录请求与响应。这样,我们可以知道每一次请求的参数,响应的结果,执行的时长等等信息。
认证拦截器,我们可以解析前端传入的用户标识,例如说 access_token 访问令牌,获得当前用户的信息,记录到 ThreadLocal 中。后续的逻辑,只需要通过 ThreadLocal 就可以获取到用户信息。
授权拦截器,我们可以通过每个 API 接口需要的授权信息,进行判断,当前请求是否允许访问。例如说,用户是否登录,是否有该 API 操作的权限等等。
以上都是拦截器实现的,那三者之前的区别是什么呢?先看一张图:
1)过滤器(filter)
- 过滤器是在web应用启动的时候初始化一次, 在web应用停止的时候销毁。
- 实现的是 javax.servlet.Filter 接口,是 Servlet 规范的一部分,过滤器是JavaEE标准,采用函数回调的方式进行。
- 在请求进入容器后,但在进入servlet之前进行预处理,请求结束是在servlet处理完以后, 过滤器包裹住servlet。
- 依赖Web容器。
- Filter只在servlet前后起作用。
2)拦截器(Interceptor)
- 实现 org.springframework.web.servlet.HandlerInterceptor 接口,动态代理,基于Spring
- 是一个Spring组件,并由Spring容器管理,并不依赖Tomcat等容器,是可以单独使用的。不仅能应用在web程序中,也可以用于Application、Swing等程序中。
- 是在请求进入servlet后,在进入Controller之前进行预处理的,Controller 中渲染了对应的视图之后请求结束。
- 拦截器可以作用到方法前后。
由于拦截器基于spring,所以它的功能最灵活,SpringBoot2.x以后版本拦截器也会拦截静态资源,优先级:META-INF/resources > resources > static > public。
3)监听器(listener)
- 实现 javax.servlet.ServletRequestListener, javax.servlet.http.HttpSessionListener,javax.servlet.ServletContextListener 等接口。
- 主要用来监听对象的创建与销毁的发生, 比如HttpSessionListener(用来监控session的创建,销毁等),ServletRequestListener(用于监控servlet上下文request),ServletRequestAttributeListener(用于监控request中的attribute的操作)。
总结一下:在web开发中,几者的执行顺序为:ServletContext -> listener -> filter -> servlet-> interceptor。
这几个一般框架用的较多,后面再细说。
六、spring boot Cors 跨域
在前后端分离之后,我们会碰到跨域的问题。在 Nginx 上配置处理跨域请求的参数。或者项目中有网关服务,统一配置处理。
这里我们说下spring boot中的处理。
方式一,使用 @CrossCors 注解,配置每个 API 接口。
方式二,使用 CorsRegistry.java 注册表,配置每个 API 接口。
方案三,使用 CorsFilter.java 过滤器,处理跨域请求。
方式一如:
@CrossOrigin(origins = "*", allowCredentials = "true") // 允许所有来源,允许发送 Cookie public class TestController { }
方式二如:
// SpringMVCConfiguration.java @Override public void addCorsMappings(CorsRegistry registry) { // 添加全局的 CORS 配置 registry.addMapping("/**") // 匹配所有 URL ,相当于全局配置 .allowedOrigins("*") // 允许所有请求来源 .allowCredentials(true) // 允许发送 Cookie .allowedMethods("*") // 允许所有请求 Method .allowedHeaders("*") // 允许所有请求 Header .maxAge(1800L); // 有效期 1800 秒,2 小时 }
方式三,在 Spring Web 中,内置提供 CorsFilter 过滤器,实现对 CORS 的处理。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/59396.html