spring aop

package com.jason.spring.aop.impl;

import java.util.Arrays;
import java.util.List;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

//把这个类声明为一个切面
//1.需要将该类放入到IOC 容器中
@Component
//2.再声明为一个切面
@Aspect
public class LoggingAspect {

//声明该方法是一个前置通知:在目标方法开始之前执行 哪些类,哪些方法
//作用:@before 当调用目标方法,而目标方法与注解声明的方法相匹配的时候,aop框架会自动的为那个方法所在的类生成一个代理对象,在目标方法执行之前,执行注解的方法
//支持通配符
//@Before("execution(public int com.jason.spring.aop.impl.ArithmeticCaculatorImpl.*(int, int))")
@Before("execution(* com.jason.spring.aop.impl.*.*(int, int))")
public void beforeMethod(JoinPoint joinPoint){
    String methodName = joinPoint.getSignature().getName();
    List<Object> args = Arrays.asList(joinPoint.getArgs());
    System.out.println("The method " + methodName + " begins " + args);
}

/**
 * 
 * @Author:lichaoqian
 * @Title: afterMethod 
 * @Time:2016年6月11日     
 * @Description:  在方法执行后执行的代码,无论该方法是否出现异常
 *
 * @param joinPoint
 */
@After("execution(* com.jason.spring.aop.impl.*.*(int, int))")
public void afterMethod(JoinPoint joinPoint){
    String methodName = joinPoint.getSignature().getName();
    List<Object> args = Arrays.asList(joinPoint.getArgs());
    System.out.println("The method " + methodName + " end " + args);
}

/**
 * 
 * @Author:lichaoqian
 * @Title: afterReturning 
 * @Time:2016年6月11日
 * @Description:  在方法正常结束后执行代码,放回通知是可以访问到方法的返回值
 *
 * @param joinPoint
 */
@AfterReturning( value="execution(* com.jason.spring.aop.impl.*.*(..))", returning="result")
public void afterReturning(JoinPoint joinPoint ,Object result){
    String methodName = joinPoint.getSignature().getName();
    System.out.println("The method " + methodName + " end with " + result);
}

/**
 * 
 * @Author:lichaoqian
 * @Title: afterThrowting 
 * @Time:2016年6月11日
 * @Description:  在目标方法出现异常时会执行代码,可以访问到异常对象,且,可以指定出现特定异常时执行通知代码
 *
 * @param joinPoint
 * @param ex
 */
@AfterThrowing(value="execution(* com.jason.spring.aop.impl.*.*(..))",throwing="ex")
public void afterThrowting(JoinPoint joinPoint, Exception  ex){
    String methodName = joinPoint.getSignature().getName();
    System.out.println("The method " + methodName + " occurs exceptions " + ex);
}

/**
 * 
 * @Author:lichaoqian
 * @Title: around 
 * @Time:2016年6月11日
 * @Description: 环绕通知需要携带 ProceedingJoinPoint 类型的参数
 *                    环绕通知 类似于  动态代理的全过程
 *                   ProceedingJoinPoint:可以决定是否执行目标方法
 *    环绕通知必须有返回值,返回值即为目标方法的返回值
 *    
 * @param proceedingJoinPoint
 */
@Around("execution(* com.jason.spring.aop.impl.*.*(..))")
public Object around(ProceedingJoinPoint proceedingJoinPoint){

    Object result = null;
    String methodName = proceedingJoinPoint.getSignature().getName();

    //执行目标方法
    try {
        //前置通知
        System.out.println("The method " + methodName + "begin with" + Arrays.asList(proceedingJoinPoint.getArgs()));

        result = proceedingJoinPoint.proceed();

        //后置通知
        System.out.println("The method " + methodName + "end with" + result);

    } catch (Throwable e) {
        //异常通知
        System.out.println("The method occurs exception : " + e);
        throw new RuntimeException();
    }
        //后置通知

    System.out.println("The method " + methodName + "end with" + result);

    return result;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值