Есть ли способ иметь одиночный pointcut и совет
У меня недавно была похожая проблема, и я пробовал различные варианты, но безрезультатно. Я закончил тем, что разделил точку «или» на две отдельные точки и вызвал один и тот же метод из обоих советов.
Я создал небольшой демонстрационный проект, чтобы проиллюстрировать рабочее решение, которое я настроил. Я надеюсь, что это поможет вам:
@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();
}
}