如何使用带注释的参数将参数传递给Spring AOP建议?

Bra*_*rad 8 aop spring aspectj

我正在使用Spring 3.1.2.RELEASE和cglib加载时编织,我正在尝试使用具有自定义注释和注释参数的方法.

建议:

@Aspect
public class MyAdvice
{
   @Around("execution(@com.mycompany.locking.Lock * *(@com.mycompany.locking.LockVal(*), ..)) " +
   "&& args(batch) && @args(propertyToLock)"
   public Object lockAndProceed(ProceedingJoinPoint pjp, Object batch, LockVal propertyToLock) throws Throwable { 
        //Do stuff.... 
        pjp.proceed();
   }
}
Run Code Online (Sandbox Code Playgroud)

这是我正在测试的类:

public interface UpdateManager
{
   public void processUpdate(MyBatchObject batch);
}


public class UpdateManagerImpl implements UpdateManager
{
   @Lock
   public void processUpdate(@LockVal("lockValue") MyBatchObject batch)
   {
      //Do stuff...
   }
}
Run Code Online (Sandbox Code Playgroud)

问题是我无法获得执行建议.如果我删除了切入点中的@args和args条件,那么建议就会触发,但是我必须通过ProceedingJoinPoint来获取我需要的参数.

为什么不提出建议?我做错什么了吗?

编辑:以下切入点作为Spring的独立程序工作:

@Aspect
public class MyAdvice
{
   @Around("execution(@com.mycompany.locking.Lock * *(@com.mycompany.locking.LockVal(*), ..)) " +
   "&& args(batch)"
   public Object lockAndProceed(ProceedingJoinPoint pjp, Object batch) throws Throwable { 
        //Do stuff.... 
        pjp.proceed();
   }
}
Run Code Online (Sandbox Code Playgroud)

但是,它在使用加载时编织的JBoss 6下不起作用.我想我的问题应该是,为什么它作为一个独立的程序工作,而不是在JBoss 6下?

Bij*_*men 1

这不是一个解决方案,但应该让您更进一步:

我假设您在注释中犯了一个拼写错误,您的意思可能是,@Aspect但不是@Advice

我的建议是尝试这些:

A。分为命名切入点和要应用于切入点的建议:

@PointCut("execution(@com.mycompany.locking.Lock * *(@com.mycompany.locking.LockVal(*), ..)) && args(batch) && @args(propertyToLock)")
public void mypointcut(Object batch, LockVal propertyToLock){}

@Around("mypointcut(batch, propertyToLock)"
public Object lockAndProceed(ProceedingJoinPoint pjp, Object batch, LockVal propertyToLock) throws Throwable { 
    //Do stuff.... 
    pjp.proceed();
}   
Run Code Online (Sandbox Code Playgroud)

b. 可能是args表达式或@args表达式导致了问题 - 尝试保留一个并删除另一个,看看哪种组合有效。

C。如果这不能缩小范围,另一种选择可能是显式添加一个argNames表达式,这可能是参数名称被清除并且在运行时没有按名称匹配:

 @PointCut("execution(@com.mycompany.locking.Lock * *(@com.mycompany.locking.LockVal(*), ..)) && args(batch) && @args(propertyToLock) && argNames="batch,test1,test2")
public void mypointcut(Object batch, LockVal propertyToLock){}
Run Code Online (Sandbox Code Playgroud)