AOP Maven依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

编写目标类与方法

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/user/api/v1/")
public class UserController { 

    @RequestMapping("/seckill")
    public String seckill(){
        return "OK";
    }
}

编写切面类,使得切面绑定目标类

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

@Aspect // 声明切面类
@Component // 注册为Spring组件,不然切面类不生效
@Slf4j
public class AopAdvice {

    /**
     * Pointcut 定义切入点,一般为方法级别。通过切点表达式提现。  匹配com.zanglikun.springdataredisdemo.controller下面所有得公用方法
     */
    @Pointcut("execution(public * com.zanglikun.springdataredisdemo.controller..*.*(..))")
    public void onePointCut() {
    }

    /**
     * @param joinPoint
     * @return
     * @throws Throwable
     * @Around("onePointCut()") 这种定义切入点方式和直接在@Around里面声明具体得切入点表达式一样
     * 环绕通知,更灵活得自定义增强通知,可以注入ProceedingJoinPoint获取相关信息和执行方法
     */
    @Around("onePointCut()")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        Object object = null;
        log.info("环绕通知开始");
        object = joinPoint.proceed();
        log.info("环绕通知结束");
        return object;
    }

    /**
     * 用于在切入点的流程执行前生效,可以在方法中注入JoinPoint用于获取相关信息
     *
     * @param joinPoint
     */
    @Before("onePointCut()")
    public void before(JoinPoint joinPoint) {
        log.info("我是前置通知");
    }

    /**
     * finally通知,这就意味着无论如何都会执行这个通知(不论是否发生异常),可以在方法中注入JoinPoint用于获取相关信息
     *
     * @param joinPoint
     */
    @After("onePointCut()")
    public void after(JoinPoint joinPoint) {
        log.info("我是finally通知");
    }

    /**
     * 异常通知,出现异常时执行,可以在方法中注入JoinPoint和Throwable用于获取相关信息
     */
    @AfterThrowing("onePointCut()")
    public void throwing() {
        log.info("我是异常通知");
    }

    /**
     * 后置返回前通知 ,在finally通知之后,方法正常退出前执行,可以注入JoinPoint 和Object 获取相关信息和方法执行成功的返回结果
     *
     * @param object
     */
    @AfterReturning(pointcut = "onePointCut()", returning = "object")
    public void returning(Object object) {
        log.info("我是后置通知,响应结果为:" + object);
    }

}

测试

我看别人说不同版本的Spring版本输出结果不一样!

2022-08-09 22:33:09.860  INFO 73812 --- [nio-8080-exec-1] c.z.s.config.AopAdvice                   : 环绕通知开始
2022-08-09 22:33:09.860  INFO 73812 --- [nio-8080-exec-1] c.z.s.config.AopAdvice                   : 我是前置通知
2022-08-09 22:33:10.061  INFO 73812 --- [nio-8080-exec-1] c.z.s.config.AopAdvice                   : 我是后置通知,响应结果为:188
2022-08-09 22:33:10.061  INFO 73812 --- [nio-8080-exec-1] c.z.s.config.AopAdvice                   : 我是finally通知
2022-08-09 22:33:10.061  INFO 73812 --- [nio-8080-exec-1] c.z.s.config.AopAdvice                   : 环绕通知结束

本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。

最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。 若排除这种情况,可在对应资源底部留言,或联络我们。

对于会员专享、整站源码、程序插件、网站模板、网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。

如果您已经成功付款但是网站没有弹出成功提示,请联系站长提供付款信息为您处理

源码素材属于虚拟商品,具有可复制性,可传播性,一旦授予,不接受任何形式的退款、换货要求。请您在购买获取之前确认好 是您所需要的资源