Spring AOP 中@Pointcut的用法

@Pointcut注解 首先,定义一个切面类,并使用@Pointcut注解定义切入点表达式。// 定义一个切入点表达式,匹配所有在com.example.service包及其子包中的方法 @Pointcut("execution(* com.example.service..*(..))") public void serviceLayer() {// 方法体可以为空,因为这个方法只是一个标识,用于定义切入点表达式 } } 阅读详情

格式:

execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern)throws-pattern?) 

括号中各个pattern分别表示:

  • 修饰符匹配(modifier-pattern?)
  • 返回值匹配(ret-type-pattern)可以为*表示任何返回值,全路径的类名等
  • 类路径匹配(declaring-type-pattern?)
  • 方法名匹配(name-pattern)可以指定方法名 或者 代表所有,set*代表以set开头的所有方法
  • 参数匹配((param-pattern))可以指定具体的参数类型,多个参数间用“,”隔开,各个参数也可以用“*”来表示匹配任意类型的参数,如(String)表示匹配一个String参数的方法;(*,String) 表示匹配有两个参数的方法,第一个参数可以是任意类型,而第二个参数是String类型;可以用(..)表示零个或多个任意参数
  • 异常类型匹配(throws-pattern?)
  • 其中后面跟着“?”的是可选项

先来看看几个例子:

//表示匹配所有方法  
1)execution(* *(..))  

//表示匹配com.savage.server.UserService中所有的公有方法  
2)execution(public * com. savage.service.UserService.*(..))  

//表示匹配com.savage.server包及其子包下的所有方法 
3)execution(* com.savage.server..*.*(..))  

用法:
Pointcut的定义包括两个部分:Pointcut表示式(expression)和Pointcut签名(signature)

@Pointcut("execution(* com.savage.aop.MessageSender.*(..))")  //Pointcut表示式
private void log(){}  //Point签名

然后要使用所定义的Pointcut时,可以指定Pointcut签名

@Before("log()")   

这种使用方式等同于以下方式,直接定义execution表达式使用

@Before("execution(* com.savage.aop.MessageSender.*(..))")

Pointcut定义时,还可以使用&&、||、! 这三个运算

@Pointcut("execution(* com.savage.aop.MessageSender.*(..))")
private void logSender(){}

@Pointcut("execution(* com.savage.aop.MessageReceiver.*(..))")
private void logReceiver(){}

@Pointcut("logSender() || logReceiver()")
private void logMessage(){}  //logMessage()将匹配任何MessageSender和MessageReceiver中的任何方法。

举例:

package com.github.pig.common.bean.aop;

import com.github.pig.common.constant.SecurityConstants;
import com.github.pig.common.util.UserUtils;
import com.xiaoleilu.hutool.util.StrUtil;
import lombok.extern.slf4j.Slf4j;
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.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;

@Slf4j
@Aspect
@Component
public class ControllerAop {
    @Pointcut("execution(public com.github.pig.common.util.R *(..))")
    public void pointCutR() {
    }

    /**
     * 拦截器具体实现
     *
     * @param pjp 切点 所有返回对象R
     * @return R  结果包装
     */
    @Around("pointCutR()")
    public Object methodRHandler(ProceedingJoinPoint pjp) throws Throwable {
        return methodHandler(pjp);
    }


    @Pointcut("execution(public com.baomidou.mybatisplus.plugins.Page *(..))")
    public void pointCutPage() {
    }

    /**
     * 拦截器具体实现
     *
     * @param pjp 切点 所有返回对象Page
     * @return R  结果包装
     */
    @Around("pointCutPage()")
    public Object methodPageHandler(ProceedingJoinPoint pjp) throws Throwable {
        return methodHandler(pjp);
    }

    private Object methodHandler(ProceedingJoinPoint pjp) throws Throwable {
        long startTime = System.currentTimeMillis();

        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();

        String username = request.getHeader(SecurityConstants.USER_HEADER);
        if (StrUtil.isNotBlank(username)) {
            log.info("Controller AOP get username:{}", username);
            UserUtils.setUser(username);
        }

        log.info("URL : " + request.getRequestURL().toString());
        log.info("HTTP_METHOD : " + request.getMethod());
        log.info("IP : " + request.getRemoteAddr());
        log.info("CLASS_METHOD : " + pjp.getSignature().getDeclaringTypeName() + "." + pjp.getSignature().getName());
        log.info("ARGS : " + Arrays.toString(pjp.getArgs()));

        Object result;

        result = pjp.proceed();
        log.info(pjp.getSignature() + "use time:" + (System.currentTimeMillis() - startTime));

        if (StrUtil.isNotEmpty(username)) {
            UserUtils.clearAllUserInfo();
        }

        return result;
    }
}

参考文档:https://www.cnblogs.com/liaojie970/p/7883687.html

spring---@Pointcut表达式 cn.javass包及所有子包下IPointcut前缀类型的的以test开头的只有一个参数类型为java.util.Date的方法,注意该匹配是根据方法签名的参数类型进行匹配的,而不是根据执行时传入的参数类型决定的。任何一个以接受“传入参数类型为 java.io.Serializable” 开头,且其后可跟任意个任意类型的参数的方法执行,args指定的参数类型是在运行时动态匹配的。任何带有一个参数的方法,且传入的参数类型是有一个泛型参数,该泛型参数类型是HashMap的基类型;将不匹配,必须使用“* *( 阅读详情

相关推荐

Spring AOP @Pointcut 12种核心用法详解:从基础语法到实战进阶

面向切面编程(AOP)是一种强大的编程范式,它通过将横切关注点(如日志、事务、安全)与核心业务逻辑分离,显著提升了代码的模块化和可维护性。其核心原理是在程序执行的特定“连接点”动态植入增强逻辑,而实现这一精准控制的关键在于“切入点”表达式。在Spring AOP框架中,@Pointcut注解及其表达式语言正是定义这些切入点的核心技术,它允许开发者以声明式的方式,精细地描述需要拦截的方法、注解、参数乃至异常。掌握@Pointcut的丰富用法,对于构建高内聚、低耦合的企业级应用至关重要,能够广泛应用于性能监控、

weixin_30239339的博客 348

【注解】@Pointcut

在 Spring AOP 中,切入点定义了哪些方法应该被拦截(即哪些方法会被增强)。一般来说,切入点可以使用表达式来指定,表达式会匹配到需要被拦截的方法。用于定义切入点,而切入点表达式指定了哪些方法会被拦截。一旦定义了切入点,你可以在通知中引用它,从而在匹配到的方法执行前后执行额外的逻辑。是 Spring AOP(面向切面编程)中的一个注解,用于定义一个切入点(Pointcut)。方法就会在匹配到的方法执行之前被调用。然后,你可以在通知(例如。

qq_35350487的博客 6303

Spring AOP @Pointcut表达式12种核心用法与实战避坑指南

面向切面编程(AOP)是Spring框架实现横切关注点(如日志、事务、权限校验)的核心技术,其本质是通过代理模式在程序运行时动态地将额外逻辑织入到特定连接点。@Pointcut表达式作为AOP的“选择器”,定义了哪些方法需要被拦截,其精准性直接决定了切面的性能与正确性。在工程实践中,开发者需要掌握从基础的execution、within匹配,到基于注解的@annotation、@target等高级用法,并能通过逻辑运算符组合它们以应对复杂业务场景。本文聚焦@Pointcut的12种核心武器,结合日志记录、事

weixin_34290096的博客 551

@Pointcut语法详解

@Pointcut语法详解 目录 @Pointcut语法详解 定义 表达式标签 execution execution格式: 例子: AspectJ类型匹配的通配符: within和@within this @target @annotation args 和 @args 命名及匿名切入点 切入点使用示例: 通知参数 AOP例子 定义 格式:@ 注解(v...

justlpf的专栏 4万+

Multisim电路仿真与实验:包含连续时间系统的模拟、周期信号频谱分析、组合逻辑电路:竞争冒险、数字锁

这些实际系统可以是电的或非电的物理量系统,也可以是经济、军事等非物理量系统。矩形周期信号的幅度和周期保持不变,随着占空比的增加(即脉宽加大),主峰高度越高,主峰宽度越窄,各谱线间隔越窄,主峰包含的谱线数量越少,有效频带宽度越窄,主峰内高次谐波分量越少。输入信号所经路径不同而引起的冒险现象,按短暂尖峰极性的不同,可将冒险分为“0-1-0”型险象(也称“1”型)和“1-0-1”型险象(也称“0”型)理想的正弦波的幅度谱包含1条谱线,证明其只有基频分量,而无谐波分量,如果能测出谐波分量,说明该正弦波已有失真。

Jumpingtigger_35的博客 1万+

PCB过孔电流承载解析:完整指南与数据参考

深入解析PCB过孔的电流承载能力,结合实际应用场景提供可靠设计参考。涵盖影响载流的关键因素,并整理实用的pcb过孔与电流对照一览表,帮助工程师优化布局与布线。

weixin_35677363的博客 630

@Pointcut 使用

切面

一只不知疲倦的学习猿 3320

CAN通信:EB中配置CAN驱动,配置参数解析

以S32K314芯片说明,其他芯片不同,参数配置也有差异。

zhangxiaio1的博客 2166

Spring AOP 中 @Pointcut的用法

Spring AOP 中 @Pointcut的用法: execution (modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern)throws-pattern?) 括号中pattern分别表示: 1、修饰符匹配(modifier-pattern?) 2、返回值匹配(ret-typ...

蜡笔小浪的博客 727

通讯接口应用笔记3:使用W5500实现Modbus TCP服务器

  前面我们设计实现了W5500的驱动程序,也讲解了驱动的使用方式。在最近一次的项目应用中,正好有一个使用W5500实现TCP通讯的需求,所以我们就使用该驱动程序轻松实现。这一篇中我们就来说一说基于我们W5500通讯驱动程序实现TCP通讯的过程。 1、应用需求   在本次应用中,要求实现一个基于W5500的Modbus TCP服务器。这个需求的描述虽然只有一句话,但是这个需求的内容可不简单。我们首先来分析一下这个需求的具体内容。   为了实现基于W5500的Modbus TCP服务器,我们必先须基于W550

木南创智 5495

Android 13 灭屏音乐播放问题解决与优化建议

通过在中增加对音乐播放状态的检测,我们成功解决了客户应用在灭屏状态下音乐播放被中断的问题。

m0_60898338的博客 1157

SpringAOP专题之6、Spring AOP中@Pointcut 12种用法

本文主要内容:掌握@Pointcut的12种用法。 Aop相关阅读 阅读本文之前,需要先掌握下面几篇篇文章内容,不然会比较吃力。 代理详解(java动态代理&CGLIB代理) jdk动态代理和cglib代理 Aop概念详解 AOP核心源码、原理详解 ProxyFactoryBean创建AOP代理 本文继续AOP,目前手动Aop中三种方式已经介绍2种了,本文将介绍另外一种:Aspe...

优快云_KONGlX的博客 1609

RK3568平台开发系列讲解(UBOOT篇)u-boot启动流程

U-Boot(Universal Bootloader)是一种开源的引导加载程序,广泛用于嵌入式系统中。它的主要功能是初始化硬件设备,加载操作系统内核,并将控制权交给操作系统。U-Boot的启动流程可以分为多个阶段,以下是典型的U-Boot启动流程:

内核笔记 1232

Spring Aop中@Pointcut用法

格式: execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern)throws-pattern?) //表示匹配所有方法 1)execution(* *(..)) //表示匹配com.savage.server.UserService中所...

只为成功找方法 不为失败找借口 1178

AutosarMCAL开发——基于TC367、EBTresos 开发之PORT

下图为开漏输出与推挽输出电路区别,推挽输出有两个极性相反的mos构成,一个管子导通另一个管子关闭以实现输出高低电平(电流较小不具备驱动能力),开漏输出仅使用一个MOS管,所以在这种模式下只能输出低电平,想要输出高电平需要外部提供(输入电流不可超过引脚最大电流显示否则会烧MCU)开漏输出:输出寄存器为低电平时,经过输出控制电路变成一个高电平,N-MOS导通,低电平从I/O引脚输出,输出寄存器为高电平时,P-MOS和N-MOS都是截止状态,电平无法通过,想要输出高电平需要外接上拉电阻。

qq_45583706的博客 1404

Oracle EBS FA 如何打开关闭的资产会计期间?

用户“运行折旧”,误勾选为“关闭期间”,还有一部分资产还需要操作报废和调整,希望后台打开关闭的资产会计期。

陈显平的专栏-Oracle EBS 1027

Spring AOP中@Pointcut的用法,注解开发AOP

Spring AOP中@Pointcut的用法,注解开发AOP 首先在xml中开启注解支持 <!--开启AOP的注解支持--> <aop:aspectj-autoproxy/> 举例,环绕通知 创建一个切点类,com.spring.service下及其子包所有方法进行匹配 public class AopPointcutClass { @Pointcut("execution(* com.spring.service..*(..))") public v

gaoshan12345678910的博客 817

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

上一篇: HTTP Status Code
下一篇: SpringBoot中WebMvcConfigurer接口详解
She_lock
博客等级 码龄12年 157粉丝 134原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值