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

aspectj不拦截带有注释的方法

颜骁
2023-03-14

我试图让aspectj拦截带注释的方法:

@Aspect
    public class InterceptMeAspect {
      @Around("execution(* *(..)) && within(@InterceptMe *)")
      public Object doIntercept(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        System.out.println("intercepted:");
        return proceedingJoinPoint.proceed();
      }
    }

    public class InterceptedExample {
        @InterceptMe
        public void doSomething(){

        }
    }

我删除了!为了简洁起见,在(InterceptMeAspect)内,但它并没有拦截太多。如果我删除注释约束(在(@InterceptMe*)内),它可以工作,但会拦截所有内容,这会造成一个大问题。

输出字节码似乎有完整的注释,所以我希望注释标准匹配。我正在或试图进行编译时编织。这很重要,因为我有另一个方面确实使用上面相同的方法工作。我怀疑该方面正在搞乱这个,但是最终的字节码不应该有注释,对吗?

编辑:这是另一个方面的代码:

@Around(
      "execution(protected * *(..)) && !within(com.walterjwhite.logging..*) && !call(*.new(..)) && within(@ContextualLoggable *) && !within(@NonLoggable *)")

我有一个通用的日志方面和一个特殊的上下文日志方面。我猜这也是写错了,应该遵循上面的格式。

共有2个答案

金承嗣
2023-03-14

当您使用自定义注释时,您应该使用@注解而不是在内部:

@Aspect
    public class InterceptMeAspect {
      @Around("execution(* *(..)) && @annotation(com.or.org.package.InterceptMe)")
柴宝
2023-03-14

而不是“执行(**(..)”

或者,如果需要从注释访问某些属性:

@Around("execution(* *(..)) && @annotation(interceptMeVar)")
public Object doIntercept(ProceedingJoinPoint proceedingJoinPoint,InterceptMe interceptMeVar)
 类似资料:
  • 所以我有一个自定义注释 我想使用它将方面编织到方法中(AspectJ,<代码>@注释(截取) )。 其思想是,当我直接注释方法截取时,我将方面编织入其中——这一部分起作用——或者如果我注释类,则应将方面编织入其所有(公共)方法中——这一部分不起作用。 此外,如果我对一个类及其一个方法进行注释,则方面应该只被编织一次,方法级注释将覆盖类级注释。 本质上,我想要一个“如果有类级注释,但只有在还没有方法

  • 我想拦截所有用特定注释注释类的构造函数调用。 我有这样一个方面: 还有一个例子: 现在,如果我更改方面并删除@注释过滤器,那么我看到aspectj正在拦截调用。此外,如果我创建一个默认构造函数,然后用注释对其进行注释,它也可以工作。 但是,我希望注释存在于类中,这样如果我有1个构造函数或10个,它们都将被相同地拦截(我只需要将其放在类中)。

  • 我试图截取带注释方法的执行,以记录执行时间;因此,我创建了一个新注释: 我将注释应用于我想要跟踪的方法(该方法的类没有注释,如@Service或@Component;这是一个问题吗?) 然后我创建类和@周围方法: 我在pom中添加了spring boot starter aop依赖项,并在主类中添加了@EnableSpectProxy(带@SpringBootApplication注释的类)。我希

  • 我试图使用测微计来记录Java应用程序中的执行时间。这与我的另一个问题有关,即使用的注释。 我有一个类< code>CountedObject,它有以下两个方法: 我定义了一个自定义注释< code>@Measured 和一个来拦截对用我的注释的方法的调用: 在我的 类中,我初始化了千分尺的定时观察实例,并在 方法中将传递给“时标”实例。 在我的应用程序main中,我创建了一个< code>Cou

  • 我最近用aspectJ和spring-aop添加了AOP到我现有的spring项目中。目标是实际截获控制器调用以修改它们发回的响应,以便将一些值绑定到此响应,我不想手动添加到每个控制器中,例如最终用户使用的实际令牌的到期日期(无论如何我都无法在控制器中显示它)。实际上,在开始单元测试之前,我一直设法让它工作: 在我的单元测试中,我使用java中的反射特性直接调用我的控制器方法,然后复制通常的过程(

  • 服务实现 但是,如果我将注释移动到公共接口方法实现,我的方面就会被触发。我应该如何定义我的切入点或配置我的方面来使我的原始用例工作?