我想创建一个动态的切入点表达式。 我有三个包 - 包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处的错误无法找到引用 切入点切入
我猜在运行时它无法找到覆盖切入点方法,因此无法解决切入点。 知道如何解决这个问题?
答案 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()”) 为不同的包编写切入点表达式并将它们绑定在一起。希望这有帮助!