spring的aop

加粗样式

/**
 * @Author:
 * @Date:2021/3/29 17:10
 * @Decription:
 */

@Component  // 标识一个spring管理的组件
@Aspect
@Order(2) // 此注解可以指定优先级,值越小,优先级越高,最大值 int最大值
public class LoggingAspect {

    /**
     * @Auther: 
     * @Date: 2021/3/31 14:49
     * @Description: 声明可重用的切入点表达式
     * 
     * 所有通知上引用reusablePoincout方法的,都要是这个com.zhou.aop.aspect.*.*(.. ))
     */
    @Pointcut("execution(* com.zhou.aop.aspect.*.*(.. )))")
    public void reusablePointCut(){

    }

    /**
     * @Auther: 
     * @Date: 2021/3/29 17:17
     * @Description: 前置通知,必须指定要作用的目标方法,execution指定切入点表达式  执行时机:在目标方法执行前执行,
     *
     *    优化切入点表达式:
     *    第一个 * : 任意修饰符 任意返回值
     *    第二个 * : 任意的类
     *    第三个 * :  任意的方法
     *         .. :  任意的参数列表
     */
//    @Before("execution(public int com.zhou.aop.aspect.impl.ArimeticCalulatorimpl.add(int,int )))")
//    @Before("execution(* com.zhou.aop.aspect.*.*(.. )))")
    @Before("reusablePointCut()")
    public void beforeMethod(JoinPoint joinPoint){

        // 获取目标方法的参数
        Object [] objects = joinPoint.getArgs();

        // 获取目标方法名
        String methodName = joinPoint.getSignature().getName();

        System.out.println("LoggingAspect 执行日志:------ 方法名:"+methodName+",begin with params["+objects[0]+","+objects[1]+"]");
    }

    /**
     * @Auther: 
     * @Date: 2021/3/31 13:47
     *  @Description:  后置通知 : 获取不到方法的返回值  执行时机:在目标方法执行后执行,如果目标抛出异常,也是必须执行
     */
    @After("execution(* com.zhou.aop.aspect.*.*(.. )))")
    public void afterMethod(JoinPoint joinPoint){

        // 获取目标方法名
        String methodName = joinPoint.getSignature().getName();

        System.out.println("LoggingAspect 执行日志:------ 方法名:"+methodName);
    }

    /**
     * @Auther: 
     * @Date: 2021/3/31 13:55
     * @Description:  返回通知:主要用于获取目标方法的返回值  必须通过returing属性指定一个参数名,必须跟形参名保持一致,如果目标抛出异常,是返回不到获取结果的
     */
    @AfterReturning(value = "execution(* com.zhou.aop.aspect.*.*(.. )))",returning = "result")
    public void AfterReturing(JoinPoint joinPoint ,Object result){

        // 获取目标方法名
        String methodName = joinPoint.getSignature().getName();

        System.out.println("LoggingAspect 执行日志:------ 方法名:"+methodName+" return result:"+result);

    }

    /**
     * @Auther:
     * @Date: 2021/3/31 14:01
     * @Description: 返回异常通知:在目标方法产生异常才会执行 ,通过throwing属性指定一个异常别名,此别名必须跟当前方法的某个形参保持一致
     */
    @AfterThrowing(value = "execution(* com.zhou.aop.aspect.*.*(.. )))",throwing = "exception")
    public void AfterThrowingMethod(JoinPoint joinPoint,Exception exception){

        // 获取目标方法名
        String methodName = joinPoint.getSignature().getName();

        System.out.println("LoggingAspect 执行日志:------ 方法名:"+methodName+" throwing exception:"+exception);
    }

    /**
     * @Auther: 
     * @Date: 2021/3/31 14:10
     * @Description: 环绕通知:spring框架为开发者提供的一种在代码中手动控制增加一个方法
     * 环绕通知:就可以看做是前面四种通知的结合体
     *
     * 环绕通知会影响其他通知,所以二者不要一起使用
     */
//    @Around(value = "execution(* com.zhou.aop.aspect.*.*(.. )))")
    public void aroundMethod(ProceedingJoinPoint joinPoint){
        // 获取目标方法的参数
        Object [] objects = joinPoint.getArgs();
//        joinPoint.
        // 获取目标方法名
        Object methodName = joinPoint.getSignature().getName();
        // 环绕目标方法执行
        try {
            //前置通知的代码
            System.out.println("LoggingAspect 执行日志:------ 方法名:"+methodName+",begin with params["+objects[0]+","+objects[1]+"]");

            System.out.println("LoggingAspect 执行日志:------ 方法名:"+methodName+" return result:");

        }catch (Exception exception){
            System.out.println("LoggingAspect 执行日志:------ 方法名:"+methodName+" throwing exception:"+exception);

        }finally {
            System.out.println("LoggingAspect 执行日志:------ 方法名:"+methodName);

        }
    }
}

spring.xml中

 <!-- 开启组件扫描  -->
    <context:component-scan base-package="com.zhou.aop.aspect"/>

    <!--  基于注解方式实现切面   -->
    <aop:aspectj-autoproxy/>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值