Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
aspectj/spring aop中的动态切入点表达式_Spring_Dynamic_Annotations_Spring Aop - Fatal编程技术网

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

aspectj/spring aop中的动态切入点表达式,spring,dynamic,annotations,spring-aop,Spring,Dynamic,Annotations,Spring Aop,我想创建一个本质上是动态的切入点表达式。 我有三个包裹- 包装1, 包装2, 普通的 common应始终包含在内,并基于我希望在任何给定时间加载package1或package2的系统属性 像下面这样 private static final String PACKAGE = System.getProperty("packagePrefix"); @Around("execution(* "+PACKAGE+"..*.*(..)) && execution(* ..commo

我想创建一个本质上是动态的切入点表达式。 我有三个包裹- 包装1, 包装2, 普通的

common应始终包含在内,并基于我希望在任何给定时间加载package1或package2的系统属性

像下面这样

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

@Around("execution(* "+PACKAGE+"..*.*(..)) && execution(* ..common.*(..))")
@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() {
  )
 }
我怎样才能做到这一点

编辑:

我发现这是非常有趣的,我想这将解决我的要求,但无法得到它的工作 所以这个链接说有下面这样的

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

@Around("execution(* "+PACKAGE+"..*.*(..)) && execution(* ..common.*(..))")
@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处找不到引用的 切入点切入点

我猜在运行时它无法找到重写的切入点方法,因此无法解析切入点。
您知道如何解决此问题吗?

您可以在中使用,它将扫描给定的包

@切入点(“在(…公共….(..)内”) public void CommonPackage(){}

@切入点(“在(…包中…”) public void specificPackage(){}

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

您可以使用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);
  }
}

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

感谢Sharmila的响应。但是这个包将如何放置在第二个切入点中?记住,包是字符串,它在运行时从system PropertyTanks Andy获取响应值。B但是我想如果只能在必须启用禁用通知时使用。因此,在我的情况下,我必须创建两个通知-一个用于package1,一个用于package2。因此,如果我有50个包,我必须创建50个通知。我真正想要的是在运行时替换表达式中的包名。您可以将
isOfInterest
方法的实现替换为无论您认为什么逻辑合适,但请记住,在您建议的每个连接点上评估布尔方法的成本都非常小。如果您建议的代码没有被多次调用,或者它不是性能关键型的,这应该不会是一个问题。@Nándor Előd Fekete-我不能对任何逻辑感兴趣,因为它只能返回boolean.From文档-if(…)body可以是任何有效的Java布尔表达式,可以使用任何公开的形式,以及连接点形式thisJoinPoint、thisJoinPointStaticPart和thisJoinPointEnclosingStaticPart。您可以将任何逻辑放入
isOfInterest
,只需返回布尔值即可。该方法的返回值将在
if()中使用
pointcut expression来决定建议是否运行。@Nándor Előd Fekete-是的,正确,但这不是我想要的。对于我的案例,建议将对两种情况(package1和package2)都启用我只是想在我的切入点表达式中引用那个特定的包。例如,如果我的进程正在运行,其中涉及到package1,切入点表达式应该应用于package1,而不是package2,反之亦然。在这两种情况下,建议都是一样的。这只能在我创建两个单独的建议并像上面提到的那样启用/禁用它们时起作用安迪克莱门特评论上述