Java Spring AOP-未调用切点

Java Spring AOP-未调用切点,java,spring,spring-aop,aspect,Java,Spring,Spring Aop,Aspect,我有一个SpringBoot应用程序。 我已经定义了一个注释,称为“Road”,并且我在Apple考虑的不同包中注释了很少的方法。 注释定义如下: @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface Track { } 我没有错过包的@Configuration类中的@enableAspectProxy 我有一个切入点和一个建议,定义如下: @Aspect @Component p

我有一个SpringBoot应用程序。 我已经定义了一个注释,称为“Road”,并且我在Apple考虑的不同包中注释了很少的方法。 注释定义如下:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Track {

}
我没有错过包的@Configuration类中的@enableAspectProxy

我有一个切入点和一个建议,定义如下:

@Aspect
@Component
public class MyAspect {

@Pointcut("execution(@Track * *.*(..))")
void annotatedMethod() {
    // No Implementation required
}

@Around("annotatedMethod() && @annotation(methodLevelTrack)")
public void adviseAnnotatedMethods(ProceedingJoinPoint proceedingJoinPoint,
        Track methodLevelTrack) throws Throwable {

     // do some task
    proceedingJoinPoint.proceed();
    // do some task after the method is executed.
  }
}
我的意图是:对于任何包中的任何方法(用@Track注释)、任何访问修饰符、任何数量的输入参数和任何返回类型,都要遵循方面的@Around建议。

现在,有趣的情况如下: 我有一个类,叫做“引擎”,它调用其他类和下游系统来执行长时间运行的操作。让我们按如下方式定义该类:

public class Engine {
  // bunch of other autowired objects

 public void processTask() {
   <autowired_object_A>.someMethod() // this method has been annotated with @Track
   <autowired_object_B>.someMethod() // this method has also been annotated with @ Track
   .... // bunch of other methods in other autowired objects that have been annotated with @ Track

   someMethodOfEngineClass(); // Now this has been defined in the Engine class as below, but pointcut doesn't recognize this method!

 }

 @Track
 private void someMethodOfEngineClass() {
  // do something
 }
}
公共类引擎{
//一堆其他自动连线对象
public void processTask(){
.someMethod()//此方法已用@Track注释
.someMethod()//此方法也已用@Track注释
..//Track注释的其他自动连线对象中的一组其他方法
someMethodOfEngineClass();//现在它已在Engine类中定义如下,但切入点无法识别此方法!
}
@跟踪
EngineeClass()的私有方法{
//做点什么
}
}
正如预期的那样,所有“其他”自动连线对象的方法都会被切入点识别,但是这个引擎类中用@Track注释的方法无法识别。有什么神秘之处

我尝试过将“SomeMethodOfEngineeClass”方法公开,返回一些东西,而不是void和所有这些组合,但它不起作用

我错过了什么? 它是切入点定义表达式吗? 我已经在其中一个子包中定义了方面,是否应该在包结构的顶层定义方面


你们能给我一些有用的建议吗?我对此有点困惑。

当您定义aop时,spring会围绕类创建代理, 所以当方法被调用时,实际上调用被委托给代理,类似于

your.package.Engine$$FastClassBySpringCGLIB$$c82923b4.someMethodOfEngineClass()
但这仅在从类外部调用方法时有效 如果从同一个类调用class方法,则实际上是通过
this.someMethodOfEngineeClass()

此处-> 您可以找到有关代理的更多信息


因此,代理被绕过,aop无法工作。

好的,我尝试将某个MethodOfEngineeClass移动到另一个类,但我将该方法作为静态方法公开。AOP在这种情况下也不起作用,“静态”是否使其成为不符合代理资格的候选者?是的,它在静态方法上不起作用。它是一个spring代理,因此
引擎
(包含方法的类)必须注入
@Autowired
,然后才能访问。