当前位置: 首页 > 知识库问答 >
问题:

组合多个切入点AspectJ返回adviceDidNotMatch警告

柯骏
2023-03-14

我试图组合getter和setter的多个切入点,以创建一个建议,如果两个切入点都被执行,将被执行。我已经在普通的AspectJ类和annotation@Aspect类中尝试过,但它仍然给我警告AdvicedNotMatch,最终建议没有执行。奇怪的是,如果我用(OR)来改变&&(AND),它会起作用,但为什么&&根本不起作用?

package testMaven;

pointcut getter() : execution(* testMaven.testing.getDd(..));
before() : getter(){
    System.out.println("test get");
}

pointcut setter() : execution(* testMaven.testing.setDd(..));
before() : setter(){
    System.out.println("test set");
}

pointcut combine(): getter() && setter();

before(): combine(){
    System.out.println("testing combine");
}
}
package testMaven;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.annotation.Before;


@Aspect
public class aspecter {

    @Pointcut("call (*  testMaven.testing.getDd(..))")
    public void getter(){

    }

    @Pointcut("call (*  testMaven.testing.setDd(..))")
    public void setter(){}


    @Pointcut("execution (*  testMaven.tester.setZ(..))")
    public void setterZ(){}

    @Before("setterZ()")
    public void settingZ(){
        System.out.println("before set Z");
    }

    @Pointcut("getter() && setter()")
    public void getterSetter(){}

    @After("getterSetter()")
    public void testerd(){
        System.out.println("works");
    }

    @Pointcut("getter() && setterZ()")
    public void getterSetter2(){}

    @After("getterSetter2()")
    public void testinger(){
        System.out.println("ok");
    }

}
package testMaven;

public class testing {

    public int dd;

    public int getDd() {
        return dd;
    }

    public void setDd(int dd) {
        this.dd = dd;
    }
}


package testMaven;

public class testing {

    public int dd;


    public int getDd() {
        return dd;
    }


    public void setDd(int dd) {
        this.dd = dd;
    }


    public void aa(int a){
        System.out.println(a);
    }
}
package testMaven;

public class MainApp {

public static void main(String[] args) {
        // TODO Auto-generated method stub

        testing test = new testing();
        test.aa(2);
        test.setDd(3);
        tester et = new tester();
        et.setZ(3);
        et.printNo(1000);
        System.out.println(test.getDd());



    }

}

我的代码有问题吗?任何帮助都很感激。

谢谢

共有1个答案

宗啸
2023-03-14

你问你的代码是否有问题。答案是肯定的。setter()getter()这两个切入点是互斥的。因此,将它们与&结合起来--即创建两个相互分离的连接点集的交集--逻辑上会导致一个空结果集。因此,您的组合切入点不匹配。您应该使用,正如uniknow在他/她的评论中建议的那样。

如果你想实现其他目标,请用一种可理解的方式来解释,如果有必要,通过举例,在评论中或更新你的问题。我真的没有得到你真正想要的。

 类似资料:
  • 我不能用“”运算符和多个注释来做切入点。我试图为一些JBehave注释创建一个切入点(@givid、@then、@when)。 为这三个注释创建切入点的语法是什么?因为我在其他切入点中使用了逻辑OR运算符,所以我假设它类似于: 但是它不起作用,我得到一个不一致的绑定异常。我尝试了其他组合,但找不到一个这样做的诀窍。

  • 我试图在方法注释上创建一个Aeyj切入点,但我总是用不同的方法失败。我使用的是aspectj自动代理(我在Spring上下文中没有配置其他编织)。我的类如下所示: 所以我想知道为什么aspectj不会创建切入点。我设法使用执行(**(…)使其工作抛出一些exc)这对我来说很好,但我仍然想知道我做错了什么。 另外,由于是在接口中定义的,我指定了实现类的注释,有没有办法让它以这种方式工作?其他代理机制

  • 使用加载时间编织,纯AspectJ。 我们有2个注释和,以及一些带注释的方法。 现在我正在为具有多个注释的定义自己的围绕方面: 这行不通。然而,捕获方法myMethod2可以很好地用于单个注释: 我只想捕获签名中同时存在时间和计数注释的方法,并且我想使用注释值。有人知道如何做到这一点吗?

  • 我正在使用Spring AOP进行日志记录。我想创建一个切入点,该切入点适用于除具有特定注释的方法外的所有方法,但我不知道如何进行。我所发现的只是如何包含带有注释的方法。

  • 我使用Spring的和注释来实现一个简单的CRUD-app,可以通过RESTful API使用。现在,我想在我的存储库上添加一个AspectJ切入点,这样每当调用接口中的CRUD-method时,就会执行一些功能。 首先,我扩展了Spring的,以便在自己的接口中添加一些自定义功能: 一切都很好,我可以通过REST客户端调用这个方法。我不必实现接口,因为Spring在后面的工作中是一个奇迹。这是扩