AOP实现

package com.even.aspect;

import java.lang.reflect.Method;

import javax.jms.Session;

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 com.even.bean.UserInfoT;

/**
 * 定义一个日志切面
 * 
 * @author lijiang
 * 
 */
@Aspect
public class LogAspect {
    /**
     * 定义一个前置通知
     */
    @Before(value = "execution(* com.even.service.impl.*ServiceImpl.*(..))")
    public void beforeAdvice(JoinPoint jp) {
        //获取目标对象
        System.out.println(jp.getTarget());
        //获取方法名
        System.out.println(jp.getSignature().getName());

        System.out.println(jp.getClass().getMethods());
        System.out.println(jp.getThis());
        System.out.println("我是前置通知,在方法执行前进行相应操作");
    }

    /**
     * 定义一个后置返回通知(afterReturning通知)
     * 
     * @param rvt
     */
    @AfterReturning(returning = "rvt", value = "execution(* com.even.service.impl.*ServiceImpl.*(..))")
    public void afterReturningAdvice(Object rvt) {
        System.out.println("我是后置返回通知,我可以在方法执行后获取到目标方法的返回");
        System.out.println(rvt);

    }

    /**
     * 定义一个后置异常通知(afterThrowing),只能是方法抛出来异常才能生效
     * 
     * @param ex
     */
    @AfterThrowing(throwing = "ex", value = "execution(* com.even.service.impl.*ServiceImpl.*(..))")
    public void afterThrowingAdvice(Throwable ex) {
        System.out.println("我是后置异常通知,可以在方法抛出异常时,获取目标方法");
    }

    @After(value = "execution(* com.even.service.impl.*ServiceImpl.*(..))")
    public void afterAdvice() {
        System.out.println("我是后置通知,不管有无返回或异常都会执行,等同于finally");
    }

    /**
     * 定义一个环绕通知(around) 固定参数ProceedingJoinPoint 程序连接点
     * 
     * @param jp
     *            程序连接点
     * @return
     * @throws Throwable
     */
    @Around(value = "execution(* com.even.service.impl.*ServiceImpl.*(..))")
    public Object aroundAdvice(ProceedingJoinPoint jp) throws Throwable {
        System.out.println("环绕通知,目标方法执行之前,可以修改目标方法的参数");
        UserInfoT user = new UserInfoT("美女,有男朋友吗?", "耍哈儿撒");

        // 可以获取到目标方法所有的参数
        Object[] objs = jp.getArgs();
        objs[0] = user;

//      //获取目标对象
//      Object o = jp.getTarget();
//      //得到setSession方法对象
//      Method sessionMethod = o.getClass().getMethod("setSession",Session.class);
//      //调用setSession方法
//      sessionMethod.invoke(o, sessionMethod);


        // 调用目标方法的执行,并得到方法的返回
        Object obj = jp.proceed(objs);
        obj = 1909;
        return obj;

    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值