在类中的方法中使用的方面,该方法的注释位于另一个注释内

时间:2019-07-12 10:32:57

标签: java spring-boot annotations aop aspect

我有一些服务类,这些服务类扩展了具有@ Annotation1批注的BaseService类。在@ Annotation1中,还有另一个注释-@ Annotation2。

我希望能够创建方面方法,该方法在@ Annotation2注释的类中的所有方法之前运行,以便在扩展BaseService类的任何服务中运行。

当我直接在BaseService中应用@ Annotation2时,我可以运行方面方法,或者当我直接在服务中应用@ Annotation1时,但是当@ Annotation2在扩展类的@ Annotation1内部时,则无法运行

@Annotation1
abstract class BaseService {
}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Inherited
@Annotation2
public @interface Annotation1 {
}
@Target(value = {ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface Annotation2 {
}
public class TestService extends BaseService {

    private void testMethod(){
        // does some service task
    }
}
@Aspect
public class TestAspect {

    @Before("@within(com.example.Annotation2) ||" +
            " within(@(@com.example.Annotation2 *)*)" +
            " @annotation(com.example.Annotation2)")
    public void aspectMethod(JoinPoint joinPoint) {
        // should run before testMethod 
    }
}

方面方法AspectMethod()应​​该在TestService中的testMethod()之前运行 但不是。

1 个答案:

答案 0 :(得分:0)

根据my other answer,我希望这样的一个方面能够起作用:

package de.scrum_master.aspect;

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

@Aspect
public class TestAspect {
  @Before(
    "execution(* *(..)) && (" +
      "within(@de.scrum_master.app.Annotation2 *) || " +
      "within(@(@de.scrum_master.app.Annotation2 *) *) || " +
      "within(@(@(@de.scrum_master.app.Annotation2 *) *) *)" +
    ")"
  )
  public void myAdvice1(JoinPoint joinPoint) {
    System.out.println(joinPoint);
  }
}

不幸的是,事实并非如此,这似乎是AspectJ的局限性。我为此创建了Buzilla ticket #549437,您可能要遵循它。

解决方法:直接注释TestService