Spring AOP 切面@Around注解的具体使用

@Around注解可以用来在调用一个具体方法前和调用后来完成一些具体的任务。

比如我们想在执行controller中方法前打印出请求参数,并在方法执行结束后来打印出响应值,这个时候,我们就可以借助于@Around注解来实现;

再比如我们想在执行方法时动态修改参数值等

类似功能的注解还有@Before等等,用到了Spring AOP切面思想,Spring AOP常用于拦截器、事务、日志、权限验证等方面。

完整演示代码如下:

需要说明的是,在以下例子中,我们即可以只用@Around注解,并设置条件,见方法run1();也可以用@Pointcut和@Around联合注解,见方法pointCut2()和run2(),这2种用法是等价的。如果我们还想利用其进行参数的修改,则调用时必须用joinPoint.proceed(Object[] args)方法,将修改后的参数进行回传。如果用joinPoint.proceed()方法,则修改后的参数并不会真正被使用。

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import javax.persistence.EntityManager;/*** 控制器切面** @author lichuang*/@Component
@Aspect
public class ControllerAspect {private static final Logger logger = LoggerFactory.getLogger(ControllerAspect.class);@Autowiredprivate EntityManager entityManager;/*** 调用controller包下的任意类的任意方法时均会调用此方法*/@Around("execution(* com.company.controller.*.*(..))")public Object run1(ProceedingJoinPoint joinPoint) throws Throwable {//获取方法参数值数组Object[] args = joinPoint.getArgs();//得到其方法签名MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();//获取方法参数类型数组Class[] paramTypeArray = methodSignature.getParameterTypes();if (EntityManager.class.isAssignableFrom(paramTypeArray[paramTypeArray.length - 1])) {//如果方法的参数列表最后一个参数是entityManager类型,则给其赋值args[args.length - 1] = entityManager;}logger.info("请求参数为{}",args);//动态修改其参数//注意,如果调用joinPoint.proceed()方法,则修改的参数值不会生效,必须调用joinPoint.proceed(Object[] args)Object result = joinPoint.proceed(args);logger.info("响应结果为{}",result);//如果这里不返回result,则目标对象实际返回值会被置为nullreturn result;}@Pointcut("execution(* com.company.controller.*.*(..))")public void pointCut2() {}@Around("pointCut2()")public Object run2(ProceedingJoinPoint joinPoint) throws Throwable {//获取方法参数值数组Object[] args = joinPoint.getArgs();//得到其方法签名MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();//获取方法参数类型数组Class[] paramTypeArray = methodSignature.getParameterTypes();if (EntityManager.class.isAssignableFrom(paramTypeArray[paramTypeArray.length - 1])) {//如果方法的参数列表最后一个参数是entityManager类型,则给其赋值args[args.length - 1] = entityManager;}logger.info("请求参数为{}",args);//动态修改其参数//注意,如果调用joinPoint.proceed()方法,则修改的参数值不会生效,必须调用joinPoint.proceed(Object[] args)Object result = joinPoint.proceed(args);logger.info("响应结果为{}",result);//如果这里不返回result,则目标对象实际返回值会被置为nullreturn result;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/592955.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java.util.regex.PatternSyntaxException: Illegal repetition {

问题描述 使用 replaceAll 替换字符串时,报如下错误: java.util.regex.PatternSyntaxException: Illegal repetition {"at java.util.regex.Pattern.error(Pattern.java:1924)at java.util.regex.Pattern.closure(Pattern.java:3104)at java.util…

7-验证码识别

文章目录 验证码识别1、验证码的用途和分类验证码的作用验证身份验证行为 验证码的类型静态验证码:图片验证码问答式验证码问答式验证码行为式验证码:点击行为式验证码:拖动间接式验证码:短信、邮件、语音电话无感验证码 2、验证码…

蓝桥 第二周 递归

递归 找重复->找重复中的变化量->参数变化趋势 练习3:数组求和 public static void main(String[] args) {int[] arr {1,2,3,4,5,6,7,8,9,10};int n arr.length;System.out.println(sum(arr,0,n));}public static int sum(int arr[],int start,int end){i…

Java hashCode()

hashCode() 有什么用 在 Java 中,hashCode() 是 Object 类中的一个方法,用于返回对象的哈希码。哈希码是一个整数值,由对象的内容和内部状态计算得出。以下是关于 hashCode() 方法的详解: 方法签名: 在 Object 类中&am…

labelstudio ocr标注数据解析

在试用labelstudio标注数据时,通常使用coco格式导出,之前标注ocr信息时,无论如何都切不出来对应的文字块,反复百度、google都没有现成的提示,后来翻labelstudio的官方文档得到提示。 The units the x, y, width and he…

15、异常处理

异常处理 ​ Go的设计者认为其它语言异常处理太过消耗资源,且设计和处理复杂,导致使用者不能很好的处理错误,甚至觉得异常和错误处理起来麻烦而忽视、忽略掉,从而导致程序崩溃。 ​ 为了解决这些问题,Go将错误处理设…

Django 分页(表单)

目录 一、手动分页二、分页器分页 一、手动分页 1、概念 页码:很容易理解,就是一本书的页码每页数量:就是一本书中某一页中的内容(数据量,比如第二页有15行内容),这 15 就是该页的数据量 每一…

报表生成器FastReport .Net用户指南:带图表的报告(图表编辑器)

FastReport .Net是一款全功能的Windows Forms、ASP.NET和MVC报表分析解决方案,使用FastReport .NET可以创建独立于应用程序的.NET报表,同时FastReport .Net支持中文、英语等14种语言,可以让你的产品保证真正的国际性。 FastReport.NET官方版…

基于SSM框架的餐馆点餐系统的设计论文

基于SSM框架的餐馆点餐系统的设计 摘要 当下,正处于信息化的时代,许多行业顺应时代的变化,结合使用计算机技术向数字化、信息化建设迈进。传统的餐馆点餐信息管理模式,采用人工登记的方式保存相关数据,这种以人力为主…

八大算法排序@计数排序(C语言版本)

目录 计数排序概念算法思想算法步骤代码实现时间复杂度空间复杂度特性总结 计数排序 概念 计数排序(Counting Sort)是一种线性时间复杂度的排序算法,适用于排序一定范围内的整数数组。它利用了输入序列的数值范围来确定每个元素在输出序列中…

【AIGC摄影构图prompt】与重不同的绘制效果,解构主义+优美连拍提示效果

提取关键词构图: 激进解构主义 在prompt中,激进解构主义的画面效果可能是一种颠覆传统和权威的视觉呈现。这种画面可能以一种极端或激烈的方式表达对现有社会结构和观念体系的批判和质疑。 具体来说,这种画面效果可能包括: 破…

怎样使用Halcon控制海康相机实时读取图像

参考收藏halcon连接海康威视相机_halcon连接海康相机-CSDN博客

德思特方案 | 易用、高效、可靠!高精度组合定位系统P-Box测试解决方案

来源:德思特测量测试 德思特方案 | 易用、高效、可靠!高精度组合定位系统P-Box测试解决方案 原文链接:https://mp.weixin.qq.com/s/VLlCAT78jQWcc8DeWlRJyw 欢迎关注虹科,为您提供最新资讯! 简介 TCU(Te…

linux搭建git仓库

git安装与配置 # git安装 yum install -y git# git配置(以下为root用户下配置) # 添加git组 groupadd git# 添加账号、密码(账号zdtest可根据自己需求修改) useradd zdtest -g git passwd zdtest创建远程仓库(linux端) 创建个人文件夹 mkdir -p /home/data/zdtestcd /home/d…

k8s的陈述式管理

k8s的陈述式管理: 所谓的陈述式管离也就是命令行工具 优点:90%以上都可以满足 对资源的增删查比较方便,对改不是很友好 缺点:命令比较冗长,复杂,难记 声明式: k8s当中的YAML文件来实现资源管…

零[0],序,halcon函数区分

1,dev_**,系统/窗口相关算子 halcon形式 dev_clear_obj //从Halcon中删除一个图标物体 dev_clear_window //清除活动窗体 dev_close_inspect_ctrl //关闭控制变量检…

94 使用快慢指针把有序链表转换为二叉搜索树

问题描述:给定一个单链表,其中的元素按升序排列,将其转换为高度平衡的二叉搜索树。在本题中,一个高度平衡二叉搜索树是指一个二叉树中每个节点的左右两个子树的高度差绝对值不超过1. 快慢指针解决:二叉搜索树的特点是…

开源MIT协议软件 - ChatGPT Admin Web

ChatGPT Admin Web 在团队和组织内共享使用人工智能的一站式解决方案。 ​编辑 ​编辑 ​编辑 CAW 是一个自托管网络应用程序,提供开箱即用的用户管理,包括后台界面以及可配置的支付计划和相关支付界面。 GitHub Sponsor / 爱发电 功能 Features …

职场干货!谈谈AI时代必备的产品设计技能

生成式AI技术在2023年的快速进步,让各行各业都加速进入了AI时代。作为科技圈活跃了一整年的绝对爆点,AI似乎真的越来越靠谱了,“所有产品都值得用AI重做一遍”的理念正在走入现实。在这篇文章中,笔者将探讨产品设计行业的从业者们…

瞬态抑制二极管(TVS)的注意事项与布局布线?|深圳比创达电子

一、瞬态抑制二极管(TVS)的注意事项 工作电压/反向截止电压(VRVRWM)此参数不需要降额,保证大于等于工作电路最大工作电压即可,越接近越好。该参数为TVS的固有参数。VBR是TVS固有参数,与外界冲击波形无关。 被保护器件…