AOP实现

来源:互联网 发布:淘宝技术排查异常订单 编辑:程序博客网 时间:2024/06/13 23:02
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 *  */@Aspectpublic 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;    }}
0 0
原创粉丝点击