Spring AOP切入点不会触发

时间:2014-11-13 17:19:12

标签: java spring spring-mvc aspectj

出于某种原因,我的切入点没有被触发。 注意:我使用的是spring风格的方面,而不是AspectJ风格。

XML代码段

<bean id="authenticationAspect" class="ssel.banking.security.AuthenticationAspect" />

<aop:config>
    <aop:aspect ref="authenticationAspect">
        <aop:pointcut id="interceptControllerInvocation"
            expression="execution(* org.springframework.web.servlet.mvc.Controller+.handleRequestInternal(javax.servlet.http.HttpServletRequest, ..)) 
                                      and args(request, ..) 
                                      and target(controller)"/>

        <aop:around pointcut-ref="interceptControllerInvocation" 
            method="authenticationAdvice"/>
    </aop:aspect>
</aop:config>

我的bean定义的类

import org.aspectj.lang.ProceedingJoinPoint;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

public class AuthenticationAspect {

    public ModelAndView authenticationAdvice(ProceedingJoinPoint pjp, HttpServletRequest request, Controller controller) throws Throwable{

        String URL = request.getRequestURL().toString();
        String viewName = URL.substring(0, URL.length() - 4);
        System.out.println(viewName);

        return (ModelAndView) pjp.proceed();
    }

}

我错过了什么吗?

1 个答案:

答案 0 :(得分:1)

最有可能调用handleRequestInternal方法不是跨越bean边界,而是来自bean本身。我猜你使用AbstractController作为控制器的基础,你可以看到handleRequest method直接调用handleRequestInternal。

如果不使用方面编译器并更改类字节码,则无法检测该代码。你可能不想用库代码(AbstractController)来做这件事。