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

使用Spring和AspectJ在类上定位基于方面的注释

常茂
2023-03-14

如何使一个方面以属于用特定注释标记的类的所有公共方法为目标?在下面的method1()和method2()应该由方面处理,method3()不应该由方面处理。

@SomeAnnotation(SomeParam.class)
public class FooServiceImpl extends FooService {
    public void method1() { ... }
    public void method2() { ... }
}

public class BarServiceImpl extends BarService {
    public void method3() { ... }
}

如果我将注释放在方法级别,这方面将工作并匹配方法调用。

@Around("@annotation(someAnnotation)")
public Object invokeService(ProceedingJoinPoint pjp, SomeAnnotation someAnnotation) 
 throws Throwable { 
   // need to have access to someAnnotation's parameters.
   someAnnotation.value(); 

}

我正在使用Spring和基于代理的方面。

共有3个答案

邓宜年
2023-03-14

这适用于Spring Boot 2:

@Around("@within(xyz)")
public Object method(ProceedingJoinPoint joinPoint, SomeAnnotation xyz) throws Throwable {
    System.out.println(xyz.value());
    return joinPoint.proceed();
}

注意,根据方法参数类型(SomeAnnotation xyz),Spring和AspectJ将知道您要查找的注释,因此xyz不必是注释的名称。

丁景山
2023-03-14

使用@target并通过反射读取类型级注释是可行的。

@Around("@target(com.example.SomeAnnotation)")
public Object invokeService(ProceedingJoinPoint pjp) throws Throwable { 
闽焕
2023-03-14

以下内容应该有效

@Pointcut("@target(someAnnotation)")
public void targetsSomeAnnotation(@SuppressWarnings("unused") SomeAnnotation someAnnotation) {/**/}

@Around("targetsSomeAnnotation(someAnnotation) && execution(* *(..))")
public Object aroundSomeAnnotationMethods(ProceedingJoinPoint joinPoint, SomeAnnotation someAnnotation) throws Throwable {
    ... your implementation..
}
 类似资料:
  • 我们试图将AspectJ实现到现有软件中,以便在进行服务调用后执行一些代码。 注: null 删除了批注,该批注可以正确地自动连接所有内容,但我们的@Aspect从未被调用。 通过声明在批注中添加了CGLIB支持,但无效。 我们尝试直接从Spring中遵循以下文档:@EnableAspectJAutoproxy Javadoc 这似乎是AspectJ处理自动连线依赖关系的代理机制的一个问题。 为什

  • 我有一些服务类,它们扩展了带有@Annotation1注解的BaseService类。在@Annotation1中还有另一个注释-@Annotation2。 我希望能够创建aspect方法,它在用@Annotation2注释的类中的所有方法之前运行,所以在任何扩展BaseService类的服务中都是如此。 当我直接在BaseService中应用@AnNotation2时,我可以运行方面方法,或者当

  • 我有一个类和一个注释 我想写一个 aspectj 切入点,它将捕获所有具有 value=true 的注释方法注释的方法。我该怎么做?

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

  • 建议前: 运行主程序时出现异常(&R): 虽然当我在beforeAdvice()和afterAdvice()方法中给出切入点表达式时,删除切入点方法的所有操作都很好 使用的Jar文件: 使用spring 3.1 Jar

  • 我的服务界面如下所示。 我希望保留在接口级别定义的注释,而不是方法实现。有办法得到这份工作吗?