spring aop的注解配置中,前置,后置,环绕通知,以及异常通知怎么获得被代理方法的参数

定义的接口

package com.aspectaop;

public interface IUserDao {

 /* (non-Javadoc)
  * @see com.aspectaop.IUserDao#save()
  */
 /* (non-Javadoc)
  * @see com.aspectaop.IUserDao#save(java.lang.String)
  */
 public abstract void save(String name);

 /* (non-Javadoc)
  * @see com.aspectaop.IUserDao#update()
  */
 /* (non-Javadoc)
  * @see com.aspectaop.IUserDao#update()
  */
 public abstract String update();

 /* (non-Javadoc)
  * @see com.aspectaop.IUserDao#doThrow()
  */
 public abstract void doThrow();

}

 

接口实现类,分别定义了传入的参数,返回有参数以及异常等方法

package com.aspectaop;

public class UserDaoImpl implements IUserDao  {

 /* (non-Javadoc)
  * @see com.aspectaop.IUserDao#save()
  */
 /* (non-Javadoc)
  * @see com.aspectaop.IUserDao#save(java.lang.String)
  */
 public void save(String name)
 {
  System.out.println("这是保存方法!");
 }
 /* (non-Javadoc)
  * @see com.aspectaop.IUserDao#update()
  */
 /* (non-Javadoc)
  * @see com.aspectaop.IUserDao#update()
  */
 public String update()
 {
  System.out.println("这是更新方法!");
  return "这是更新方法返回的值!";
 }
 
 /* (non-Javadoc)
  * @see com.aspectaop.IUserDao#doThrow()
  */
 public void doThrow()
 {
  throw new RuntimeException("返回了例外!");
 }
}

定义切面方法

package com.aspectaop;

import org.aspectj.lang.ProceedingJoinPoint;
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.aspectj.lang.annotation.Pointcut;

@Aspect
public class AspectBean {

 @Pointcut("execution(* com.aspectaop.UserDaoImpl.*(..))" )
 public void anyWay()
 {}
 
 @Before("anyWay() && args(name)")

//这里采取的是args(name)的方法,表示被代理的方法传入的参数,在doValidate中的name要和这个名字对应,

并且这里定义的是String表示只有方法中传入参数类型是STRING的,才会被拦截
 public void doValidate(String name)
 {
  System.out.println("这是事前方法.."+"获得事前方法的参数:"+name);
 }
 
 @AfterReturning(pointcut="anyWay()",returning="result")

//这里用returning表示要返回方法的值,然后作为参数传递到doAfterReturning中,注意doAfterReturning中的result也要和returning="result"中的result对应
 public void doAfterReturning(String result)
 {
  System.out.println("这是最终方法.."+"获得最终方法的参数:"+result);
 }
 
 @AfterThrowing(pointcut="anyWay()",throwing="e")

//该部分解释和返回值的一致
 public void doAfterThrowing(Exception e)
 {
  System.out.println("例外通知:"+e);
 }
 
 
 @Around("anyWay()")

//环绕通知必须按照以下方法签名来写,除了doAround的这个方法名可以自己定义和pjp这个名字可以自己定义以外,然后执行pjp.proceed()方法才会被执行
 public Object doAround(ProceedingJoinPoint pjp) throws Throwable{
  System.out.println("执行前");
  Object o = pjp.proceed();
  System.out.println("执行后");
  return o;
 }
}

你可能感兴趣的:(spring aop)