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

用于子类中自定义注释的Spring AOP切入点表达式

阎雪峰
2023-03-14

我正在研究一个日志方面,它需要截获所有用自定义注释注释的类和方法。

下面是可以在类和方法上注释的自定义注释类:

@Documented
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
public @interface Loggable {
    LogLevel value();
}

我使用这些切入点表达式拦截带有注释@loggable的方法和类,这适用于所有简单类,但不适用于扩展或实现的类。

//Works for annotation @Loggable on class level
@Pointcut("execution(* *(..)) &&  within(@com.logger.Loggable *)")
public void classAnnotationLogger() {
}

//Working for methods annotated with @Loggable
@Before(value = "@annotation(loggable)", argNames = "jp, loggable")
public void logBeforeAdvice(JoinPoint jp, Loggable loggable) {
  ..
  ..
}
@Component
@Loggable(LogLevel.INFO)
public abstract class Processor{
  public void process(){
      readProcess();
  }

  public abstract void readProcess();
}
@Service
@Loggable(LogLevel.INFO)
public class MyServiceProcessor extends Processor {

  @Override
  public void readProcess(){
    ...
    ...
  }
}
Processor processor = applicationContext.getBean(MyServiceProcessor.class);
processor.readProcess();

但是对process()而不是readprocess调用通知。

当对任何类或方法应用注释@logabble时,如何编写同时拦截对任何子类方法调用的切入点表达式?

共有1个答案

楮乐邦
2023-03-14

嗯,首先这个

@Pointcut("execution(* *(..)) &&  within(@com.logger.Loggable *)")
public void classAnnotationLogger() {}

只是一个切入点,而不是一个建议,所以它不会做任何事情,除非你也有一个实际使用这个切入点的建议。你没有贴出这样的忠告,所以我只能推测。

其次,您没有提供任何会由

@Before(value = "@annotation(loggable)", argNames = "jp, loggable")
public void logBeforeAdvice(JoinPoint jp, Loggable loggable) {}
Processor processor = applicationContext.getBean(MyServiceProcessor.class);
processor.readProcess();
public void process() {
    readProcess();
}
 类似资料:
  • 我试图在切入点中检测用注释注释的类的任何方法。 我试过这个: 但它不起作用。我做错了什么? 谢谢

  • 我有一个场景,我需要拦截一些子类方法,但我找不到合适的切入点表达式来这样做。 我有一个面向客户机的接口,它有一个方法。 当用户调用方法时,我希望截获方法。我可以很容易地截获,但是似乎没有什么能截获子类方法。我甚至尝试使用自定义注释来注释这些信息方法,但没有成功。到目前为止,我提出了以下方面 将设置为true或false也没有帮助。我知道AOP不能拦截私有子类方法,但这些是公共的。有可能做到这一点吗

  • 问题内容: 我正在寻找一个切入点,该切入点与类中具有特定注释的子类的类中的方法执行相匹配。出色的AspectJ备忘单帮助我创建了以下切入点: 这与带有@AnnotationToMatch的类A的所有方法调用匹配,但与扩展了A的类B的方法匹配。我如何将两者匹配? 问题答案:

  • 如何计算方面中的Spring Security表达式?我想我可以很容易地使用完成这项工作的类I spring框架

  • add:如果我将方法存根添加到Fragment2中,就可以开始使用next annotation,但这是一个非常难看的解决方案 解决方案:多亏了@Kriegaex,我找到了解决方案: