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

AOP:在一个切入点中支持@Annotation和@Indit

关玮
2023-03-14
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface TestAspectAnnotation {
    String[] tags() default {};
}
@Around(value = "@annotation(annotation) || @within(annotation)", argNames = "pjp,annotation")
public Object testAdvice(ProceedingJoinPoint pjp,
                         TestAspectAnnotation annotation) throws Throwable {

        String[] tags = annotation.tags();

        Stopwatch stopwatch = Stopwatch.createStarted();
        Object proceed = pjp.proceed();
        stopwatch.stop();
        long executionTime = stopwatch.elapsed(TimeUnit.MILLISECONDS);

        sendMetrics(tags, executionTime);

        return proceed;

    }

是否有一种方法可以在类级和方法级同时提供单一的切入点和建议来支持注释?

共有1个答案

夏景胜
2023-03-14

有没有办法有一个单一的切入点和建议

我最近也遇到了类似的问题,尝试了各种选择,但都无济于事。最后,我将“or”切入点拆分为两个独立的切入点,并从两个建议中调用相同的方法。

我已经建立了一个小的演示项目来说明我已经建立的工作解决方案。我希望这会对你有所帮助:

@Component
@Aspect
public class SomeAspect {
    @Around(value = "@within(annotation)", argNames = "pjp,annotation")
    public Object methodAdvice(ProceedingJoinPoint pjp, SomeAnnotation annotation) throws Throwable {
        return logTags(pjp, annotation);
    }

    @Around(value = "@annotation(annotation)", argNames = "pjp,annotation")
    public Object classAdvice(ProceedingJoinPoint pjp, SomeAnnotation annotation) throws Throwable {
        return logTags(pjp, annotation);
    }

    private Object logTags(ProceedingJoinPoint pjp, SomeAnnotation annotation) throws Throwable {
        Stream.of(annotation.tags()).forEach(System.out::println);
        return pjp.proceed();
    }
}
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface SomeAnnotation {
    String[] tags() default {};
}
@Service
@SomeAnnotation(tags = {"c", "d"})
public class SomeService {
    @SomeAnnotation(tags = {"a", "b"})
    public void test() {
    }
}
@SpringBootApplication
public class Application implements ApplicationRunner {
    @Autowired private SomeService someService;

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Override
    public void run(ApplicationArguments args) throws Exception {
        someService.test();
    }
}
 类似资料:
  • 我正在尝试实现一个可以跨应用程序中的多个包应用的记录器方面。它是一个大型SpringWeb应用程序,具有许多模块。每个模块都有自己的控制器、服务和DAO。我定义的切入点针对包中每个类上的所有公共方法。这是

  • 在包com.repository我有: 扩展spring数据存储库的独立接口 我想测量从包(与数据库通信)com.repository所有方法的执行时间。但我想避免重复 现在 @切入点(“执行(public*com.repository…)”) 我有一些方法记录了两次-从接口和类实现这个接口。我想要么不记录在同一个包中有实现类的接口的方法,要么不记录在同一个包中实现接口的类的方法。 我如何用切入点

  • 我有@tenatable注释来决定切入点: 这是我的观点: 这对于这个服务类来说没有任何问题: 当我调用doSomething()方法时,我的方面正在运行,这没问题,但我想为属于spring数据的CrudRepository接口实现方面。 我已经改变了我的Aspect来实现这一点,如下所示: 这是存储库: 但当我调用MyRepository中的任何方法时,它都不起作用。 有什么办法吗? 编辑:当我

  • 下面是我的代码片段: 服务我mpl.java 现在,我想要的是每当从方法worker(请求,字符串id)抛出null点异常时,我想要执行一些特定的任务,如上图所示。为此,我编写了一个方面类,如下所示: 我的方面。Java语言 电流输出: 期望输出: 如您所见,没有被触发,因此没有打印值。这是什么原因? 注: > 还尝试更改方法的名称,以消除任何也不起作用的重载问题。 到目前为止,尝试了各种其他切入

  • 我对Spring和AOP是新手。我正在尝试这个简单的事情,我已经创建了一个自定义注释,当放在任何方法之前时,它应该执行一些代码。这是我创建的注释 问题是我的spring aop从来没有被触发过。我在中包含了一个bean 有人能指出我缺少什么吗?

  • 问题是@before和@afterreturn有效,但对于pointcut却不是这样。