扩展 class 中方法的方面不起作用

Aspect for methods in extended class does not work

我尝试将方面应用于两个抽象方法 class,它们由另一个 class 扩展。

问题是我使用的切入点不起作用。

代码如下所示:

public class ClassA extends ClassB {

    public void testMethod(String testString, Integer testInt){
        extendedClassMethod1(testString, testInt);
        extendedClassMethod2(testString, testInt);
    }
}

public abstract class ClassB {

   public String extendedClassMethod1(String testString, Integer testInteger) {
        return testString + testString.toString();
    }

    public String extendedClassMethod2(String testString, Integer testInteger) {
        return testString + testString.toString();
    }
}

@Aspect
public class AspectClass {

   @AfterReturning(
            value = "execution(* com.test.ClassB.*(..)) && args(testString, testInteger)",
            returning = "result")
    public void aspectMethod(JoinPoint joinPoint, String testString, Integer testInteger, String result){
        // do something
    }
}

目标是创建方面,当在扩展 ClassB 的 classes (f.e.ClassA) 中使用 extendedClassMethod1 或 extendedClassMethod2 时,它们将起作用。

另一件事是 Intellij 显示方面方法应该应用于这两个方法,但在运行时它不会。

我评论了:

If you really use AspectJ (e.g. via load-time weaving configuration) and not Spring AOP, it works as you wish. If it does not work, you are not using AspectJ. It is as simple as that. If you want to challenge my statement, just provide an MCVE incl. Maven POM and ideally on GitHub, so I can just clone and run the application, e.g. via Spring Boot. BTW, in order to make this work with POJOs you don't need Spring at all. I tested your code outside of Spring.

为了支持我的说法,这是我使用 POJOs + AspectJ 的 MCVE:

Base class(为什么要抽象,因为没有抽象方法):

package de.scrum_master.app;

public abstract class ClassB {
  public String extendedClassMethod1(String testString, Integer testInteger) {
    return testString + " / " + testInteger.toString();
  }

  public String extendedClassMethod2(String testString, Integer testInteger) {
    return testString + " / " + testInteger.toString();
  }
}

(具体)子class:

package de.scrum_master.app;

public class ClassA extends ClassB {
  public void testMethod(String testString, Integer testInt) {
    extendedClassMethod1(testString, testInt);
    extendedClassMethod2(testString, testInt);
  }
}

驱动申请:

package de.scrum_master.app;

public class Application {
  public static void main(String[] args) {
    ClassA classA = new ClassA();
    classA.extendedClassMethod1("eleven", 11);
    classA.extendedClassMethod2("twenty-two", 22);
    classA.testMethod("thirty-three", 33);
  }
}

看点:

package de.scrum_master.aspect;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;

@Aspect
public class AspectClass {
  @AfterReturning(
    value = "execution(* de.scrum_master.app.ClassB.*(..)) && args(testString, testInteger)",
    returning = "result"
  )
  public void aspectMethod(JoinPoint joinPoint, String testString, Integer testInteger, String result) {
    System.out.println(joinPoint);
    System.out.println("  testString = " + testString);
    System.out.println("  testInteger = " + testInteger);
    System.out.println("  result = " + result);
  }
}

控制台日志:

execution(String de.scrum_master.app.ClassB.extendedClassMethod1(String, Integer))
  testString = eleven
  testInteger = 11
  result = eleven / 11
execution(String de.scrum_master.app.ClassB.extendedClassMethod2(String, Integer))
  testString = twenty-two
  testInteger = 22
  result = twenty-two / 22
execution(String de.scrum_master.app.ClassB.extendedClassMethod1(String, Integer))
  testString = thirty-three
  testInteger = 33
  result = thirty-three / 33
execution(String de.scrum_master.app.ClassB.extendedClassMethod2(String, Integer))
  testString = thirty-three
  testInteger = 33
  result = thirty-three / 33