Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >你不是说你会aop吗?

你不是说你会aop吗?

作者头像
Java旅途
发布于 2020-07-22 09:53:02
发布于 2020-07-22 09:53:02
43000
代码可运行
举报
文章被收录于专栏:Java旅途Java旅途
运行总次数:0
代码可运行

一大早,小王就急匆匆的跑过来找我,说:周哥,那个记录日志的功能我想请教一下。

因为公司某个项目要跟别的平台做对接,我们这边需要给他们提供一套接口。昨天,我就将记录接口日志的工作安排给了小王。

下面是我跟小王的主要对话。

我:说说怎么了?

小王:我将记录接口日志的功能放到了每个controller中,现在感觉有点繁琐,我这样做是不是不太合适?

我:为什么要去每个接口里记录日志?

小王:最开始我是用的拦截器,但是这样一个请求就记录了两条记录。

我:为什么是两条?

小王:在preHandle中记录一条请求数据,在postHandle中记录一条响应数据。

我:。。。你不是说你会Aop吗?

小王:Aop也是一样,在前置通知记录一条请求数据,后置通知记录一条响应数据。

小王:这个数据和以前记录操作日志的不太一样,以前只需要在前置通知记录一条操作日志就可以了,但是现在有响应,所以只能在controller中记录日志了。

我:那你知不知道有个环绕通知?你说一下Aop就几种通知类型。

小王:总共有五种,分别是:

  • 前置通知:在我们执行目标方法之前运行(@Before
  • 后置通知:在我们目标方法运行结束之后,不管有没有异常(@After
  • 返回通知:在我们的目标方法正常返回值后运行(@AfterReturning
  • 异常通知:在我们的目标方法出现异常后运行(@AfterThrowing
  • 环绕通知:目标方法的调用由环绕通知决定,即你可以决定是否调用目标方法,joinPoint.procced()就是执行目标方法的代码 。环绕通知可以控制返回对象(@Around)

接下来,我们一起来演示一下如何使用环绕通知来解决小王的问题。

第一步:提供接口用来接收参数和响应接口

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@RestController
public class TestController {
    @GetMapping("/getName")
    public String getName(HttpServletRequest request) throw Exception {

        String result = "Java旅途";
        String age = request.getParameter("age");
        if("18".equals(age)){
            result = "无法识别";
        }
        return result;
    }
}

第二步:定义切点

execution()是比较常用的定义切点的表达式,execution()语法如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
execution(修饰符  返回值  包..方法名(参数) throws异常)

其中:

修饰符和throws异常可以省略不写

根据这些解释,我们可以将第一步中的接口用execution()表达式来描述一下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
execution(String binzh.website.controller.TestController.GetName(HttpServletRequest))
  • *:匹配所有项
  • ..:匹配任意个方法参数
  • ..出现在类名中时,后面必须跟*,表示包、子孙包下的所有类;

现在我们优化一下上面的表达式,定义切面为controller包及controller下面所有包的所有方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
execution(* binzh.website.controller..*.*(..))

第三步:环绕通知记录日志

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Around("execution(* binzh.website.controller..*.*(..))")
public Object around(ProceedingJoinPoint joinPoint) {
    ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
    HttpServletRequest request = attributes.getRequest();
    String age = request.getParameter("age");
    Object proceed = "";
    try {
        proceed = joinPoint.proceed();
    } catch (Throwable e) {
        e.printStackTrace();
    }
    System.out.println("age==="+age);
    System.out.println("proceed ===="+proceed);
    return proceed;
}

运行结果如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
age===19
proceed ====Java旅途

我们之所以可以用环绕通知来处理小王的问题。其中一个重要的原因就是,我们提供的所有接口都是经过统一加密的,最后请求的参数都是一个固定的名字。还需要注意的一点就是,环绕通知的返回值类型必须大于等于方法的返回值,即:加入你方法返回String类型,环绕通知不能写成void类型

小王看到这里后,恍然大悟,准备赶紧回去试一下。我急忙拉住他。

我:如果接口出现异常了怎么办?

小王:那我在异常通知里处理就可以了。

我:你再想一下?

小王:好像不行,异常通知里获取不到请求参数。

我:在环绕通知中捕获处理可以吗?

这时候,看见小王眼睛发光,惊讶的说了一句:环绕通知太牛批了,竟然可以完成前置通知、后置通知和异常通知的工作!

这篇文章戏有点多,别见怪。

实战是提升技术最有效的途径!

< END >

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-07-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java旅途 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Spring Boot如何利用AOP巧妙记录操作日志?
SpringAOP的相关的知识点包括源码解析,我已经在之前的文章中详细说明,如果对AOP的概念还不是特别清晰的话。
烂猪皮
2021/01/14
1.2K0
Spring Boot如何利用AOP巧妙记录操作日志?
Spring AOP使用
AOP全程是Aspect—Oriented—Programming,面向切面编程。AOP采用横向抽取机制,将分散在各个方法中的重复代码抽取出来,然后在程序编译或运行时,再将这些提取出来的代码应用到需要执行的地方。
ha_lydms
2023/08/09
1930
Spring AOP使用
Spring boot中使用aop详解
aop是spring的两大功能模块之一,功能非常强大,为解耦提供了非常优秀的解决方案。
天涯泪小武
2019/01/17
1.4K0
SpringBoot 利用 AOP 记录日志
Aspect Oriented Programming 面向切面编程。解耦是程序员编码开发过程中一直追求的。AOP也是为了解耦所诞生。
JAVA日知录
2020/05/25
1.9K0
SpringBoot使用AOP详解
AOP(Aspect Oriented Programming)意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。
半月无霜
2023/03/03
6280
SpringBoot使用AOP详解
Spring Boot 使用 AOP 实现 REST 接口简易灵活的安全认证
本文将通过AOP的方式实现一个相对更加简易灵活的API安全认证服务,我们先看实现,然后介绍和分析AOP基本原理和常用术语。
JavaFish
2020/02/24
8970
【Spring学习】AOP实现日志记录
AOP,面向切面编程。通过预编译方式和运行时动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。
pbinlog
2022/03/21
7030
【Spring学习】AOP实现日志记录
SpringBoot应用中使用AOP记录接口访问日志
通知描述了切面要完成的工作以及何时执行。比如我们的日志切面需要记录每个接口调用时长,就需要在接口调用前后分别记录当前时间,再取差值。
macrozheng
2019/07/22
1.8K0
SpringBoot应用中使用AOP记录接口访问日志
使用aop加解密http接口
最近在写一个小程序接口,由于安全性比较高,因此需要给请求参数和响应进行加密处理。如果在每个方法上都加密解密,那样代码就显得太繁琐了而且工作量会加大。所以,我们会统一进行加解密处理,一种比较传统的方式就是通过拦截器进行拦截处理。在这里我们选择通过使用spring的aop来实现。
Java旅途
2020/06/25
8590
舞动切面:Spring AOP 的编程艺术
欢迎来到Spring AOP的世界,一个充满魔法和创意的地方。在这个舞台上,代码和切面一同演绎着优雅的交汇,为我们的程序增添了更多的色彩。本篇博客将深入浅出地探讨Spring AOP的开发,带你踏入切面编程的神奇之旅。
繁依Fanyi
2024/01/14
3981
深入理解AOP思想
概念 : AOP为Aspect Oriented Programming的缩写, 意思为切面编程。
用户11097514
2024/05/30
1220
深入理解AOP思想
【Spring 篇】注解之舞:Spring AOP的优雅表演
欢迎来到Spring的代码舞台,在这里,我们将沉浸在一场注解之舞的盛宴中。今天我们将探讨如何使用注解方式实现Spring AOP,一种优雅而富有表现力的编程技术。
繁依Fanyi
2024/01/11
3950
【Spring 篇】注解之舞:Spring AOP的优雅表演
Spring AOP使用入门案例
首先从start.spring.io上下载一个Spring Boot工程,只需要引入web依赖即可。然后我们创建一个Controller:
conanma
2021/10/28
7460
给SpringBoot接口加全局日志(AOP)
一想到,每个接口都需要加一个开始时间和一个结束时间,我就感觉特别烦,就是不想撸代码。
猿码优创
2019/07/27
2K0
Java 实战系列·Spring Boot Aspect
AOP 是一种与语言无关的程序思想、编程范式。项目业务逻辑中,将通用的模块以水平切割的方式进行分离统一处理,常用于日志、权限控制、异常处理等业务中。
数媒派
2022/12/01
1.7K0
Spring通过XML配置文件以及通过注解形式来AOP 来实现前置,后置,环绕,异常通知
AOP是Aspect Oriented Programming的缩写,意思是面向方面编程,AOP实际是GoF设计模式的延续
yaphetsfang
2020/07/30
1.2K0
【JavaEE进阶】Spring AOP
AOP(Aspect Oriented Programming):⾯向切面编程,它是⼀种思想,它是对某⼀类事情的 集中处理。比如在我们之前我的博客系统中所学习的用户登录权限的效验,没学 AOP 之前,我们所有需要判断用户登录的页面(中的方法),都要各自实现或调用用户验证的方法.但是有了AOP之后,我们只需要在某一处配置一下,所有需要判断用户登录页面(中的方法)就可以全部实现用户登录验证了,不再需要每个方法中都写相同的用户登录验证了.
xxxflower
2023/10/16
2890
【JavaEE进阶】Spring AOP
Spring 框架学习(八)——AOP 的认识与使用
通知类型就是想要加的代码(校验、日志等) 是在对象方法的前面还是后面执行的类型,这就是通知类型。
RAIN7
2022/07/09
5220
Spring 框架学习(八)——AOP 的认识与使用
聊一聊 AOP :表现形式与基础概念
本系列分为 上、中、下三篇。上篇主要是介绍如果使用 AOP ,提供了demo和配置方式说明;中篇来对实现 AOP 的技术原理进行分析;下篇主要针对Spring中对于AOP的实现进行源码分析。
磊叔的技术博客
2025/06/07
860
聊一聊 AOP :表现形式与基础概念
SpringBoot系列之使用自定义注解校验用户是否登录
记得今年年初刚开始面试的时候,被问的最多的就是你知道Spring的两大核心嘛?那你说说什么是AOP,什么是IOC?我相信你可能也被问了很多次了。
一个程序员的成长
2020/11/25
1.2K0
SpringBoot系列之使用自定义注解校验用户是否登录
相关推荐
Spring Boot如何利用AOP巧妙记录操作日志?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验