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;
}
}
AOP实现
最新推荐文章于 2023-04-19 22:47:45 发布