回顾SpringAOP中的Advice

GAMES101学习-第8课进行shader的初步了解 详细理解课上展示的像素着色器GLSL,以及了解了API、OpenGL、DirectX到底是什么,还有shadertoy这个网站的初步探索。 阅读详情

 

一 概述

@Before:前置通知

@After :后置通知,方法执行完之后

@AfterReturning:返回通知,完成执行之后

@AfterThrowing:异常通知,抛出异常之后

@Around:环绕通知

二 Advice应用实例

通过环绕通知获取方法执行时间

@Component
@Aspect
public class RepositoryAspect {

    @Pointcut("execution(* com.repository..*(..))")
    private void crud() {
    }

    //环绕通知
    @Around("crud()")
    public Object logPerformance(ProceedingJoinPoint joinPoint) throws Throwable {
        long startTimes = System.currentTimeMillis();
        Object result = null;
        String name = "-";
        try {
            name = joinPoint.getSignature().toShortString();
            result = joinPoint.proceed();
            return result;
        } catch (Throwable t) {
            throw t;
        } finally {
            long duration = System.currentTimeMillis() - startTimes;
            StringBuilder stringBuilder = new StringBuilder();
            stringBuilder.append(name);
            System.out.println(stringBuilder+"执行时间为"+duration)
        }
    }
}
public class AbstractAspect {
	protected ThreadLocal<Map<String, Object>> threadLocal = new ThreadLocal<>();

	protected ThreadLocal<Map<String, Object>> getThreadLocal(){
		if (threadLocal.get() == null){
			threadLocal.set(new HashMap<>());
		}
		return threadLocal;
	}
}
@Component
@Aspect
public class ControllerAspect extends AbstractAspect {

    //对于controller包下所有类和方法进行获取,除被注解NoHealth标注的类除外。
    @Pointcut("execution(* com.controller..*(..))&&!@annotation(NoHealth)")
    private void controllerPointCut() {
    }

    //在方法执行之前对参数进行处理 
    @Before(value = "controllerPointCut()")
    public void doBefore(JoinPoint joinPoint) {
        try {
            getThreadLocal().get().put(joinPoint.getSignature().toString(), System.currentTimeMillis());
            Object[] args = joinPoint.getArgs();
            MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
            String[] parameterNamesArray = methodSignature.getParameterNames();
            int i = 0;
            List<String> argsList = new ArrayList<>();
            if (!ObjectUtils.isEmpty(args)) {
                for (Object object : args) {
                    if (ObjectUtils.isEmpty(object)
                            || (object instanceof BeanPropertyBindingResult)
                            || (object instanceof HttpServletResponse)
                            || (object instanceof Boolean)
                            || (object instanceof String)
                            || (object instanceof Integer)) {

                        if ((object instanceof Boolean) || (object instanceof String) || (object instanceof Integer)) {
                            StringBuilder stringBuilder = new StringBuilder();
                            stringBuilder.append("{\"");
                            stringBuilder.append(parameterNamesArray[i]);
                            stringBuilder.append("\":\"");
                            stringBuilder.append(object);
                            stringBuilder.append("\"}");
                            argsList.add(JSONObject.fromObject(String.valueOf(stringBuilder)).toString());
                        }
                        i++;
                        continue;//跳出当前循环,且不执行此语句后面的语句!
                    }

                    if (!(object instanceof HttpServletRequest)) {
                        argsList.add(JSONObject.fromObject(object).toString());
                    } else {
                        HttpServletRequest request = (HttpServletRequest) object;
                        Enumeration<String> parameterNames = request.getParameterNames();
                        Map<String, String> argsMap = new HashMap<>();
                        while (parameterNames.hasMoreElements()) {
                            String elementName = parameterNames.nextElement();
                            argsMap.put(elementName, request.getAttribute(elementName).toString());
                        }
                        if (!ObjectUtils.isEmpty(argsMap)) {
                            argsList.add(JSONObject.fromObject(argsMap).toString());
                        }
                    }
                    i++;
                }
            }
            StringBuilder stringBuilder = new StringBuilder();
            stringBuilder.append(JSONArray.fromObject(argsList));
        } catch (Exception e) {
          
        }
    }

    //对方法执行之后的返回值进行某种操作
    @AfterReturning(value = "controllerPointCut()", returning = "response")
    public void responseLog(JoinPoint joinPoint, Object response) {
        try {
            if (response == null) {
                response = new Object();
            }
            long duration = System.currentTimeMillis() - (Long) threadLocal.get().get(joinPoint.getSignature().toString());
            StringBuilder stringB uilder = new StringBuilder();
            stringBuilder.append(JSONObject.fromObject(response));
        } catch (Exception e) {
           
        }
    }

    //对方法抛出的异常进行操作
    @AfterThrowing(value = "controllerPointCut()", throwing = "e")
    public void exceptionLog(Exception e) {

    }
}

根据这些实例就可以参照写一些简单的SpringAOP实例了!

【YOLOv11改进 - 特征融合】DySample :超轻量级且高效的动态上采样器 阅读详情

相关推荐

告别盲目调参:手把手教你用RKISP2.x Tuner理解AWB、AE、NR等核心模块

本文详细介绍了如何使用RKISP2.x Tuner工具进行ISP调试,重点解析AWB、AE、NR等核心模块的调参技巧。通过RV1126平台的实际操作演示,帮助工程师快速掌握可视化对比实验方法,告别盲目调参,提升图像信号处理效率。

weixin_30300225的博客 392

spring-aop组件详解——实现Advice通知

spring-aop组件详解——实现Advice通知

lixuanhong的博客 939

TI 实时操作系统SYS/BIOS使用总结

1:概述: SYS/BIOS 是一个可扩展的实时的操作系统。具有非常快速的响应时间(在中断和任务切换时达到较短的延迟),响应时间的确定性,强壮的抢占系统,优化的内存分配和堆栈管理(尽量少的消耗和碎片)。能够实现系统的模块化并可裁剪。 最大的特点就是:实时。 2:XDCtools: XDCtools 是SYS/BIOS引用的一种实时的软件组件技术(RTSC),它包括一些有用的工具,标准的AP

带头奋青的博客 5万+

Spring 增强处理Advice

Before、AfterReturning、AfterThrowing、After、Around 不管配置哪种Advice,都需要指定2个属性: method:指定将哪个方法转换成Advice。 pointcut或pointcut-ref:pointcut直接指定切入点表达式;pointcut-ref引入已有的切入点表达式。 Before:在目标执行之前织入的Advice。 AfterRe...

liwenyang1992的专栏 759

【STM32】STM32F103C8T6多串口通信实战:3个USART并行收发与中断处理优化

本文详细介绍了STM32F103C8T6多串口通信的实战技巧,包括3个USART模块的并行配置、中断优先级优化及数据收发冲突规避策略。通过硬件初始化步骤、中断优先级设置和双缓冲区实现等方案,有效解决了多串口通信中的数据错乱问题,提升系统稳定性与效率。

weixin_42526417的博客 170

论文阅读 Quantum Convolutional neural network

在传统的局域序参量(如磁化强度 ⟨Xi⟩)无法有效区分某些拓扑相(如 Haldane 相)时,字符串序参量(SOP)提供了一种方法来识别这些相。字符串序参量的定义通常涉及多个远离的站点之间的长程关联,通常具有如下形式:Zi,Xk,Zj是泡利矩阵(Pauli operators)。指数项 eiπ∑k=ijXk表示一个相位因子。这意味着我们要计算两个远离站点 i,j 的Z 分量的关联,同时考虑它们之间的X 作用。这个非局域的字符串序参量可以用来检测对称保护拓扑(SPT)相。

m0_54373077的博客 2002

AOP :五种Advice注解

                                                     五种Advice注解 @Before,前置通知 @After(finally), 后置通知,方法执行完之后 @AfterReturning,返回通知,成功执行之后 @AfterThrowing,异常通知,只有抛出异常之后执行 @Around,环绕通知...

liyu121的博客 3222

Mike 21如何制作随水深变化的糙率文件

MIKE 21如何制作随水深变化的糙率文件

zhuzhujiayoua的博客 2250

【Spring AOP】@Aspect结合案例详解(一): @Pointcut使用@annotation + 五种通知Advice注解(已附源码)

在微服务流行的当下,在使用SpringCloud/Springboot框架开发中,AOP使用的非常广泛,尤其是@Aspect注解方式当属最流行的,不止功能强大,性能也很优秀,还很舒心!所以本系列就结合案例详细介绍@Aspect方式的切面的各种用法,力求覆盖日常开发中的各种场景。本文带来的案例是:打印Log,主要介绍@Pointcut切点表达式的@annotation方式,以及 五种通知Advice注解:@Before、@After、@AfterRunning、@AfterThrowing、@Around。

天罡gg的专栏 2万+

基于boot + 双app升级方案

基于boot+双app的升级方案

weixin_44654285的博客 4515

ESP32-S3模组上跑通esp32-camera(32)

ESP32-S3模组上跑通esp32-camera(32)

phmatthaus的专栏 772

11_统一异常处理

1. 创建异常状态码枚举类 /*** * 错误码和错误信息定义类 * 1. 错误码定义规则为5为数字 * 2. 前两位表示业务场景,最后三位表示错误码。例如:100001。10:通用 001:系统未知异常 * 3. 维护错误码后需要维护错误描述,将他们定义为枚举形式 * 错误码列表: * 10: 通用 * 001:参数格式校验 * 11: 商品 * 12: 订单 * 13: 购物车 * 14: 物流 * * */ public enum BizCodeE

weixin_44390164的博客 356

用 OData V2 元数据驱动表格体验:SAP UI5 Smart Table 全面解析

摘要: Smart Table是SAPUI5中基于OData元数据自动生成表格的控件,支持个性化、排序、过滤等高级功能。文章从九个维度深入解析其工作机制:1)通过元数据和注解自动生成列;2)支持多种表格类型;3)关键属性的静态化特性;4)与其他智能控件的协同;5)导航属性和导出的处理;6)响应式设计;7)个性化配置;8)性能优化策略;9)端到端实现案例。Smart Table通过读取OData元数据自动完成表格渲染,大幅减少开发工作量,特别适合企业级应用开发场景。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 322

SpringAOP学习--SpringAOP简介及原理

为了标准化AOP,Spring引入了一套AOP顶级API--AOP联盟,用来定义和使用AOP。底层根据配置生成JDK或CGLIB动态代理对象。SpringAOP不是一种新的AOP实现,使用JDK动态代理和CGLIB动态代理实现SpringAOP配置方式核心是Advisor,可以自定义Advisor,也可以通过AspectJ间接定义AdvisorSpringAOP的实现遵循了AOP联盟规范,AOP联盟顶级API接口贯穿了整个AOP过程httpshttpshttpshttpshttps。...

drhrht的博客 4392

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Spring AOP 中的代理对象是怎么创建出来的?

小伙伴们看一下,这里就是先按照类去匹配,匹配通过则继续按照方法去匹配,方法匹配器要是设置的 true,那就直接返回 true 就行了,否则就加载当前类,也就是 targetClass,然后遍历 targetClass 中的所有方法,最后调用。关于第二个 if 我多说一句,如果这里进来的是一个切面的 Bean,例如第一小节中的 LogAspect,这种 Bean 显然是不需要代理的,所以会在第二个方法中直接返回,如果是其他普通的 Bean,则第二个 if 并不会进来。

江南一点雨的专栏 1626

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Java-Spring入门指南(十二)SpringAop的三种实现方式

本文介绍了Spring AOP的三种实现方式,帮助开发者灵活应用面向切面编程。文章首先回顾了AOP的核心概念与作用,包括解决横切关注点问题,减少代码冗余。随后详细讲解了三种实现方式:基于Spring接口的通知实现(通过实现MethodBeforeAdvice等接口)、自定义切面实现(通过配置切面类)和注解驱动实现(使用@Aspect等注解)。每种方式都配有代码示例和项目结构说明,重点演示了前置增强的实际应用。文章还强调了AOP在日志记录、事务管理等场景的优势,并提供了Spring官方文档参考链接,适合Spr

2402_83322742的博客 754

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Spring AOP回顾

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33888907的博客 102

Spring AOP深度解析:调用链与适配器模式

本文深入解析了Spring AOP的核心实现机制,重点探讨了适配器模式在AOP中的应用及其执行流程。主要内容包括:1)AOP核心概念回顾,明确连接点、切点、通知等关键术语;2)适配器模式在Advisor和Advice转换中的具体应用,实现组件解耦和统一处理;3)调用链执行机制的深度解析,通过责任链模式实现拦截器的有序执行;4)Pointcut的精准匹配机制及双检查策略;5)多种设计模式在AOP中的协同应用,包括适配器、代理、责任链等模式。文章通过代码示例和流程图,系统展示了Spring AOP的分层设计思想

weixin_44289947的博客 1001

Spring AOP中定义切点(PointCut)和通知(Advice)

本文讨论一下Spring AOP编程中的两个关键问题,定义切点和定义通知,理解这两个问题能应付大部分AOP场景。 如果你还不熟悉AOP,请先看AOP基本原理,本文的例子也沿用了AOP基本原理中的例子。 切点表达式 切点的功能是指出切面的通知应该从哪里织入应用的执行流。切面只能织入公共方法。 在Spring AOP中,使用AspectJ的切点表达式语言定义切点其中excecution()

GarfieldEr007的专栏 2102

java事务不生效场景_你知道SpringAOP的在实际应用中场景有哪些吗?赶紧学起来...

为什么会有面向切面编程(AOP)?我们知道Java是一个面向对象(OOP)的语言,但它有一些弊端,比如当我们需要为多个不具有继承关系的对象引入一个公共行为,例如日志、权限验证、事务等功能时,只能在在每个对象里引用公共行为。这样做不便于维护,而且有大量重复代码。AOP的出现弥补了OOP的这点不足。Spring AOP 中设计的一些核心知识,面试问题?1、能说一下Spring AOP用的是哪种设计模式...

weixin_39838362的博客 131

Spring4.x 笔记(13):Spring 编程式 AOP

文章目录问题回顾Spring Advice 增强Advice 类型具体Advice 使用介绍前置 Advice后置 Advice环绕 Advice异常 Advice引介 AdviceSpring Pointcut 切点切点概述切点类型Spring Advisor 切面切面 Advisor 类型切面类型概述切点切面 PointcutAdvisor具体切面用法介绍静态普通方法名匹配切面- Static...

Sam Blog 731

springboot(4)

OOP(Object Oriented Programming,面向对象编程)AOP(Aspect Oriented Programming,面向切面编程)POP(Process Oriented Programming,面向过程编程)FP(Functional Programming,函数式编程)AOP的诞生就是为了弥补OOP(面向对象编程)的不足。面向对象非常擅长 解决纵向的业务逻辑,但是对于横向的公共操作却显得有些“力不从心”。

qq_50845989的博客 251

Spring源码之AOP分析

本文我们开始讲解Spring中的AOP原理和源码,我们前面手写了AOP的实现,了解和自己实现AOP应该要具备的内容,我们先回顾下,这对我们理解Spring的AOP是非常有帮助的。

小兔子的博客 1148

Spring技术内幕(3)Spring AOP的实现

本章内容 Spring AOP概述、Spring AOP的设计与实现、建立AopProxy代理对象、Spring AOP拦截器调用的实现、Spring AOP的高级特性。 3.1 Spring AOP概述 3.1.1 AOP概念回顾 AOP是Aspect-Oriented Programming(面向方面编程或面向切面)的简称。 关于AOP技术简介: AspectJ:源代码和字节码级别...

qq_42499188的博客 417

【2. 2】初识 AOP + 搭建 AOP 环境

一、回顾 在 【5】AOP 雏形 —> 案例引出 AOP 中,我们对转账案例的代码冗余、以及事务不一致性问题进行了 分析 —> 解决,并留下一个 悬念,怎么通过 Spring 的 AOP 配置,完成转账案例,接下来正式介绍 Spring AOP! 二、AOP 是什么? 一、概念 Spring AOP 即 Aspect-oriented programming,面向切面编程,是作为面向...

无敌兔0x01 748
上一篇: 回顾SpringAOP的使用方式
下一篇: 回顾SpringAOP的实现原理
至学者
博客等级 码龄9年 180粉丝 773原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值