品牌型号:联想ThinkPad X1
系统:Windows10家庭版
软件版本:Spring 5.3.7
我们在做Spring项目的时候,方法执行完之后经常想再插一手,比如记录日志、统计耗时、或者对返回结果做点加工,这时候我们可以考虑用后置切面来做,有很多人知道AOP这个概念,但真到自己配置的时候,前置通知和后置通知怎么分、返回值怎么拿、异常情况怎么处理,还是容易绕进去。现在前后端分离已经是企业开发主流架构,Spring MVC本身能不能支撑这种架构呢?下面就给大家介绍一下Spring MVC如何配置后置切面,Spring MVC可以前后端分离吗的相关内容。
一、Spring MVC如何配置后置切面
要配后置切面,我们需要把AOP的依赖引进来才行,项目里加上spring-boot-starter-aop就行,这个starter把AspectJ相关的包都带上了。

我们定义一个切面类加上@Aspect和@Component两个注解,@Aspect注解表示这是个切面,@Component是为了让Spring能把它扫描进容器交给IOC管理,如果少了@Component这个类根本不会被识别。

切面类里我们用@Pointcut来定义个切点表达式,定好之后,后置通知具体怎么写要分情况看,如果需要在方法执行结束后执行操作(无论正常返回或抛出异常,例如资源清理),选用 @After。它不关心方法是正常返回还是抛了异常,方法结束就会触发。

想拿到方法的返回值继续做加工例如记个日志,可以用@AfterReturning,这个注解可以指定returning属性,把返回值绑定到通知方法的参数上,方法签名里对应参数的类型要和实际返回类型匹配,类型对不上是拿不到值的。

如果只关心方法抛异常之后要做什么,比如统一记录错误信息,这时候用@AfterThrowing,同样可以通过throwing属性把异常对象传进通知方法里处理。

@After是无论如何都执行,@AfterReturning只在正常返回时触发,@AfterThrowing只在抛异常时触发,实际项目里比较常见的做法是用@AfterReturning统一处理接口返回结构,再单独用全局异常处理器兜底异常情况。
二、Spring MVC可以前后端分离吗
Spring MVC当然可以用来做前后端分离,现在大多数用Spring MVC搭的项目走的都是这条路,能不能分离,要看我们Controller返回的是页面还是数据,依靠的是@ResponseBody或者@RestController这类注解,方法返回的对象会被消息转换器序列化成JSON,不再走视图解析那一套流程,只要接口出的是数据,前端拿什么框架去渲染页面,我们后端根本不用去管,这就是分离的基础。

如果只是接口返回JSON数据还不够,在真实项目开发的时候要考虑的东西还要更细一些,例如跨域是绕不开的一环,前后端分开部署之后端口或者域名多半不一致,就需要靠@CrossOrigin或者重写WebMvcConfigurer里的addCorsMappings方法来统一放行,不然浏览器那边直接就拦下来了。

在做异常处理的时候也要跟着换思路了,不能出错就跳错误页,需要靠@ControllerAdvice配合@ExceptionHandler把各种异常统一转成结构化的JSON,让前端能读懂错误码和提示信息。

有一点容易被我们忽略,要注意接口和数据结构的规范化,前后端分离之后双方是靠接口文档对话的,返回结构最好统一封装,状态码、消息、数据体分层清楚,前端按约定取值,不用每个接口都单独猜格式,我们配合Swagger或者Knife4j之类的工具生成接口文档,联调效率能提高不少。

以上就是Spring MVC如何配置后置切面,Spring MVC可以前后端分离吗的全部内容了。后置切面靠的是@After、@AfterReturning、@AfterThrowing这几个注解分场景处理方法执行完之后的收尾工作,前后端分离是靠@RestController让接口只吐数据,再配上跨域配置和全局异常处理,把接口做好后交给前端,前端才好对接。