aspectj/spring aop中的动态切入点表达式
我想创建一个本质上是动态的切入点表达式。 我有三个包裹- 包装1, 包装2, 普通的 common应始终包含在内,并基于我希望在任何给定时间加载package1或package2的系统属性 像下面这样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
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,反之亦然。在这两种情况下,建议都是一样的。这只能在我创建两个单独的建议并像上面提到的那样启用/禁用它们时起作用安迪克莱门特评论上述