您的位置:首页 > 编程语言 > Java开发

spring aop 获取方法的参数

2013-06-05 23:38 525 查看
使用spring的aop,可以在指定方法上增加切面,那么如何获取方法的参数(实参)呢?示例如下:com.shop.jn.service.UserService的login(ActionContext actionContext,User user) 方法上增加切面,并且在切面方法中获取该方法的参数(ActionContext actionContext,User user)。beans.xml中部分代码如下:<aop:config><aop:pointcut id="userServicePointcut"expression="execution(* com.shop.jn.service.*.login(..)) and args(actionContext,user)" /><aop:aspect id="myAspect" ref="loginTimesAop"><aop:around pointcut-ref="userServicePointcut" method="around"arg-names="actionContext,user" /></aop:aspect></aop:config>切面方法如下:
public Object around(ProceedingJoinPoint call, ActionContext actionContext,
User user) throws Throwable {
String aop_info = "aop[" + this.getClass().getSimpleName() + "]:";
logger.info( aop_info+"This is around method.");
if (timesFail >= Utils.MAX_LOGIN_FAIL_TIMES - 1) {
if (!isLocked) {// first into this if clause
task = null;
}
// ValueStack stack = actionContext.getValueStack();
// stack.set("MESSAGE_IS_LOGIN", "You have failed " + timesFail
// + " times.");
if (timer == null) {
timer = new Timer();
}
if (isLocked) {// over three times and is still locked,meanwhile use
// try to log in
if (task != null) {
logger.info(aop_info+"cancel task.");
task.cancel();
task = null;
}
}
logger.info(aop_info+"start task....");
if (task == null) {
task = new MyTask(this);
}
timer.schedule(task, Utils.MILLISECONDS_WAIT_WHEN_FAIL);
isLocked = true;
return Utils.LOGIN_RESULT_OVER_TIMES;// not success
}
Object obj = call.proceed();
int resultCode = (Integer) obj;
if (resultCode == Utils.LOGIN_RESULT_SUCCESS) {
timesFail = 0;
} else {
timesFail++;
logger.info(aop_info+"times of fail:" + timesFail+" times.");
}
return obj;
}
注意:下面的配置是错误的:
<aop:config>
<aop:pointcut id="userServicePointcut"
expression="execution(* com.shop.jn.service.*.login(..)) and args(ActionContext,User)" />
<aop:aspect id="myAspect" ref="loginTimesAop">
<aop:around pointcut-ref="userServicePointcut" method="around"
arg-names="actionContext,user" />
</aop:aspect>
</aop:config>
说明:(1)在pointcut中精确匹配到参数时,使用args,args中是参数列表,不包括参数类型;(2)arg-names中指定的参数名称与args中的参数名称必须是一致的

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息