spring AOP中的PointCut:execution表达式详解

首先我们要引入对应的aspectj的对应依赖

<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.8.7</version>
</dependency>

这里已经默认你创建好了你的对应 切面类以及切点和对应的通知方式

下面是常用的execution表达式

1)execution(* *(..))  
//表示匹配所有方法  
 
2)execution(public * com.controller.UserController.*(..))  
//表示匹配com.controller.UserController类或接口中所有的公有方法  
 
3)execution(* com.controller..*.*(..))  
//表示匹配com.savage.server包及其子包下的所有方法,4大权限修饰符
//public,protected,private,default
 
4)execution(* get*(..))
//表示以 get开始的方法
 
5)execution(* com.controller.*.*(..))
//controller包下的任何的方法
 
6)execution(* com.controller..*.*(..))
//controller包下以及子包下的任何的方法

此时我们可以来做一个简单的小demo进行演示

首先我们需要创造一个切面类

@Aspect
@Component
public class Advice {

    @Around("execution(public * com.example.aopdemo.demos.web.BasicController.*(..))  ")
    public Object around(ProceedingJoinPoint pjp) throws Throwable{

        System.out.println("在执行之前做点什么");
        Object proceed = pjp.proceed();
        System.out.println("在执行之后做点什么");
        return proceed;
    }


}

这里可以简单说明下:

  1. 命名规范:一般对于切面类而言会以Aspect结尾
  2. 这个切面类需要被spring所管理
  3. execution需要路径正确,否则启动会报错
  4. ProceedingJoinPoint是切点对象,是aspectj封装的,执行切点方法需要我们主动调用proceed()方法

启动运行测试一下:

对应controller:

@RequestMapping("/hello")
@ResponseBody
public String hello(@RequestParam(name = "name", defaultValue = "unknown user") String name) {
    System.out.println("我被执行了");
    return "Hello " + name;
}

对应控制台输出

2024-10-13 18:23:44.255  INFO 4308 --- [)-192.168.31.26] CoolRequest Method Call                  : call:com.example.aopdemo.demos.web.BasicController.hello
2024-10-13 18:23:44.255  INFO 4308 --- [)-192.168.31.26] CoolRequest Method Call                  : args:{0=caiyi}
在执行之前做点什么
我被执行了
在执行之后做点什么
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值