首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

spring aop的注解配置中,前置,后置,环绕通知,以及错误通知如何获得被代理方法的参数

2012-10-21 
spring aop的注解配置中,前置,后置,环绕通知,以及异常通知怎么获得被代理方法的参数定义的接口package com

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;
?}
}

热点排行