读懂aop

package com.aspect;

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;

/**
 *
 * 定义切面对象类型  特点
 * 1.使用@Aspect注释修饰
 * 2.切面内部包含切入点和通知的定义
 * 2.1通过Pointcut注解定义切入点通常会对某个类或多个类中的方法的集合
 * 2.2通过@Around等注解描述的方法为通知方法(此方法内部要实现扩展业务的植入)
 * @title: SysLogAspect
 * @Author 
 * @Date: 2021/8/5 19:47
 */
@Aspect
@Component
@Slf4j
public class SysLogAspect {
    /**
     *     bean(bean名称)为一个切入点表达式
     */
    @Pointcut("bean(orderServiceImpl)")
    public void doLogPointCut(){}
  //  @Around() -->  @Before()  --> @After()  -->  @AfterReturning

    @Before("doLogPointCut()")
    public void doBefore(JoinPoint jp){
        System.out.println("before通知 输出的值 :"+jp.getTarget());
    }
    @After("doLogPointCut()")
    public void doAfter(JoinPoint jp){
        System.out.println("after通知输出的值:"+jp.getKind());
    }
    @AfterReturning("doLogPointCut()")
    public void doAfterReturning(JoinPoint jp){
        System.out.println("AfterReturning 通知输出的值:"+jp.toLongString());
    }
    /**
     * 环绕通知方法(这个内部方法方法可以在方法执行之前,之后添加扩展业务逻辑)
     * @param jp 连接点(封装了切入点中某个正在执行的方法信息)
     * @return 为目标方法的执行结果
     */
    @Around("doLogPointCut()")
    public Object doAround(ProceedingJoinPoint jp) throws Throwable {
        log.info("start {}",System.currentTimeMillis());
        try {
            //调动逻辑--》本类中其他通知--》其他切面--》目标方法
            Object result = jp.proceed();
           log.info("end {}",System.currentTimeMillis());
            return result;
        }catch (Throwable e){
            log.error("error {}",e.getMessage());
            throw e;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值