需要帮助在方法内创建特定切入点

时间:2011-01-22 16:42:37

标签: spring aspectj spring-aop aop

我从一个原始问题开始 Need help creating a specific pointcut that utilizes a value from a method annotation

我决定要问另一个问题来改变我正在采取的方法。 我有一个方法( navigation ),在该方法内部调用另一个方法,我希望有@Around建议。

@RequestMapping(method = RequestMethod.GET)
public String navigation(ModelMap model) {
    ...        
            // Call Auto Handling
            logger.info("Call AutoHandling");
            this.processAutoHandling(callSession, FunctionalArea.PRE_MAIN_MENU);
        }
        ...

    return forward(returnView);
}

这是可能的,因为如果方法在同一个类中,我似乎无法使其工作。

这项工作如果它不在对象本身上:

@Around("execution(* *.processAutoHandling(..)) &&" +
        "args(callSession, functionalArea) && " +
        "args(functionalArea) && " +
        "target(bean)"
)
public Object processAutoHandlingCall2(ProceedingJoinPoint jp,
                                      CallSession callSession,
                                      FunctionalArea functionalArea,
                                      Object bean)
        throws Throwable {
    logger.debug("processAutoHandleCall");
    return jp.proceed();
}

在我的控制器中进行此调用:

autoHandlingComponent.processAutoHandling(callSession, FunctionalArea.PRE_MAIN_MENU);

而不是

this.processAutoHandling(callSession, FunctionalArea.PRE_MAIN_MENU);

1 个答案:

答案 0 :(得分:1)

您似乎正在使用Spring的基于代理的AOP。如果是这样,这是一个已知的限制。有关详细信息,请参阅Spring文档中的Understanding AOP Proxies。您有两种方法可以解决此问题:

  1. 使用文档中列出的AopContext.currentProxy()方法。我会劝阻这种方法,因为你的代码现在将非常明确地与Spring AOP绑定。
  2. 使用AspectJ的字节码编织。由于没有代理涉及它,因此您不会遇到“this”指向原始对象的问题,而代理只能透明地用于外部对象。