【问题标题】:Aspectj : getting the @Pointcut details in @AspectAspectj :在@Aspect 中获取@Pointcut 详细信息
【发布时间】:2011-03-12 00:23:22
【问题描述】:

我有一个被定义的切入点调用的方面,类似于这样:

@Around("pointcut1(request) || pointcut2(request) || pointcut3(request)")
public ModelAndView myAspect(ProceedingJoinPoint proceedingJp, 
                             HttpServletRequest request)
{
    //do something.
}

所以在这个方面,我需要知道这个 myAspect 是针对哪个切入点 (pointcut1/2/3) 调用的。有什么我可以在方面得到这个的原因吗?

添加更多细节.....

在@Aspect(方法)中没有任何参数可以获取。我知道我可以获得 JoinPoint ,但它对我来说效果不佳。 这样的东西会很方便....

@Around("pointcut1(request) || pointcut2(request) || pointcut3(request)")
public ModelAndView myAspect(ProceedingJoinPoint proceedingJp, PointCut pc ,HttpServletRequest request){
if (pc.equals("pointcut1")) {
    //do something.
}
if (pc.equals("pointcut2")) {
    //do something.
}
// ...

}

请推荐!!

还有什么建议!!!

【问题讨论】:

    标签: aspectj


    【解决方案1】:

    做到这一点的最好方法是为每个组件切入点编写建议并设置一个标志,表明它已经到达。由于 Aspect 优先级(即,哪个建议在哪个其他建议之前运行),您需要确保组件建议在词法上高于最终的环绕建议。它看起来像这样:

    boolean pointcut1Reached = false;
    
    ModelAndView around(HttpServletRequest request) : pointcut1(request) {
        pointcut1Reached = true;
        try {
             proceed(request);
        } finally {
             pointcut1Reached = false;
        }
    }
    
    // ... similar for other pointcuts
    
    @Around("pointcut1(request) || pointcut2(request) || pointcut3(request)")
    public ModelAndView myAspect(ProceedingJoinPoint proceedingJp, HttpServletRequest request){
        if (pointcut1Reached) {
            //do something.
        }
        if (pointcut2Reached) {
            //do something.
        }
        // ...
    }
    

    这里需要注意两点:

    1. 如果您的程序是多线程的,那么您将需要确保切面的实例化是适当的。
    2. 我使用代码风格的 AspectJ 语法,因为我个人对注释风格有偏见。 :)

    为避免多线程代码的问题,您可以为方面指定实例化模型。

    aspect MyAspect percflowbelow( execution ( * * HttpServletRequest.something(..) ) { ... }
    

    上面的声明说,在对HttpServletRequest.something() 的调用下面,将为每个cflow 实例化一个方面的实例。如果在方面内部达到了其中一个建议,但它不在 percflowbelow 中,则该建议将不会运行。

    现在唯一的窍门是弄清楚应该在percflowbelow 内放置什么样的切入点。在包含所有切入点的堆栈中是否有一些方法调用方式向上?

    一旦你弄清楚了这一点,你就不需要担心多线程了。

    【讨论】:

    • 您好安德鲁,感谢您的建议。它看起来不错,对我有用,但看起来有点重(两个建议),正如你所指出的,我需要处理多线程。在@Aspect(方法)中没有任何参数可以得到。我知道我可以获得 JoinPoint ,但它对我来说效果不佳。像这样的东西会很方便。 @Around("pointcut1(request) || pointcut2(request) || pointcut3(request)") public ModelAndView myAspect(ProceedingJoinPoint procedureingJp, PointCut pc ,HttpServletRequest request){
    • 好吧,如果您使用代码风格 aspectj,则无需担心多线程。您可以在方面中指定实例化模型。我将编辑问题,向您展示如何操作。
    猜你喜欢
    • 2012-06-02
    • 2020-10-08
    • 2018-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多