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

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

袁博
2023-03-14

我有一些服务类,它们扩展了带有@Annotation1注解的BaseService类。在@Annotation1中还有另一个注释-@Annotation2。

我希望能够创建aspect方法,它在用@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 
    }
}

Aspect方法aspectMethod()应在TestService中的testMethod()之前运行,但不会。

共有1个答案

张鹏鹍
2023-03-14

根据我的另一个回答,我本以为这样的一个方面会起作用:

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);
  }
}

不幸的是,它没有,这似乎是一个AEX J限制。我为它创建了Bugzilla票证#549437,您可能想要遵循。

解决方法:直接注释TestService

 类似资料:
  • 对于用@X注释的类中的方法或用@X注释的方法,我需要一个切入点。我还需要注释对象。如果类和方法都被注释,我更喜欢将方法注释作为参数。 我尝试了以下操作,这会产生“绑定不一致”的警告。(为什么不直接将其设置为null?) 以下内容创建了“穿过切入点中的“||”的参数x的不明确绑定”警告。(在我看来,这不一定有意义:为什么不绑定第一个短路评估?) 如果存在类和方法注释,则将前面的尝试拆分为两个,自然会

  • 如何使一个方面以属于用特定注释标记的类的所有公共方法为目标?在下面的method1()和method2()应该由方面处理,method3()不应该由方面处理。 如果我将注释放在方法级别,这方面将工作并匹配方法调用。 } 我正在使用Spring和基于代理的方面。

  • 问题内容: 我需要 在类中使用@X注释的方法或使用@X注释的方法的切入点 。我还 需要注释对象 。如果同时注释了类和方法,则 我更喜欢将方法注释作为参数 。 我尝试了以下操作,这将创建“不一致的绑定”警告。(为什么不将它们设置为null?) 下面创建“跨’||’的参数x的模糊绑定 在切入点”警告。(我认为这并不一定有意义:为什么不绑定第一个短路评估?) 如果存在类和方法注释,则将先前的尝试自然地分

  • 我有以下问题: 我已经为安全性创建了注释: 在我具有类之间的继承性的情况下,是否也有可能所有类都具有@Security注释来获得最具体的定义? 约西

  • 问题内容: 我在Service类中看到了一种被标记为的方法,但是它也在同一类中调用了其他未标为的方法。 这是否意味着对单独方法的调用导致应用程序打开与DB的单独连接或暂停父事务等? 不带任何注释的方法的默认行为是什么,而另一个带有注释的方法调用该方法的默认行为是什么? 问题答案: 当你调用没有事务块之内的方法时,父事务将继续使用新方法。它将使用与父方法(with )相同的连接,以及在调用的方法中导