aspectj / spring aop中的动态切入点表达式

时间:2016-11-22 19:54:15

标签: spring dynamic annotations spring-aop

我想创建一个动态的切入点表达式。 我有三个包 - 包1, 包2, 通用

常见应该总是被包含并且基于系统属性我想在任何给定时间加载package1或package2

如下所示

private static final String PACKAGE = System.getProperty("packagePrefix");

@Around("execution(* "+PACKAGE+"..*.*(..)) && execution(* ..common.*(..))")

我怎样才能做到这一点?

修改

我发现this非常有趣,我想这将解决我的要求,但无法使其正常工作 所以此链接表示如下所示

@Aspect
public abstract class MyAspect {

protected abstract pointcut();


@Before("pointcut()")
public void myAdviceMethod() {
// Advice code goes here
 }
 }


 public class ConcreteAspect extends MyAspect {

 @Pointcut("execution(* com.acme.*.*(..))")
   protected pointcut() {
  )
 }

下面包含在我的Java配置

@Bean
public ConcreteAspect myAspect() {
    return new ConcreteAspect();
}

但是低于错误:

  

java.lang.IllegalArgumentException::: 0处的错误无法找到引用   切入点切入

我猜在运行时它无法找到覆盖切入点方法,因此无法解决切入点。 知道如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

您可以使用if()子句进行如下检查:

aspect X {
  before(): execution(* Code.*(..)) &&
    if(isOfInterest(thisJoinPointStaticPart.getSignature().getDeclaringType())) {
   System.out.println("advice running");
  }

  public static boolean isOfInterest(Class s) {
    return s.getPackage().toString().startsWith(packagePrefix);
  }
}

我认为类似的东西适用于注释样式语法。但是这种方法将在每个匹配的连接点包括运行时测试。

答案 1 :(得分:0)

你可以使用内部,它将扫描给定的包

@Pointcut( “内( .. ..共同(..)”) public void CommonPackage(){}

@Pointcut( “内( .. .. PACKAGE (..)”) public void specificPackage(){}

使用@ Around / @之前或根据您的情况提出的任何建议 @Around( “执行(CommonPackage()&安培;&安培; SpecificPackage()”) 为不同的包编写切入点表达式并将它们绑定在一起。希望这有帮助!