Spring AOP: поведение @within при расширении классов

У меня есть аннотация, которая будет использоваться в расширенных классах-заполнителях. По сути, у нашего сервиса будет реализация, и у нас будет явное расширение, которое будет аннотировано. Я не уверен, в чем проблема, но @within не вызывает код, а @target вызывает.

Вот пример кода — https://github.com/sahil-ag/Spring-AOP-Sample

@Component
public BaseClass { public void getData() {return "";}}

@SampleAnnotation
@Component
public DerivedClass extends BaseClass {}

Здесь, если мы теперь используем @within(SampleAnnotation) pointcut, мы не сможем перехватить getData() при вызове из bean-компонента производного класса.


person Sahil Agarwal    schedule 30.10.2018    source источник
comment
Пожалуйста, не позволяйте людям уйти от вашего вопроса, вместо этого добавьте код в свой вопрос.   -  person M. Deinum    schedule 30.10.2018
comment
@M.Deinum обновил вопрос   -  person Sahil Agarwal    schedule 30.10.2018


Ответы (1)


Аннотация @within используется, когда вы хотите определить класс, в котором расположены pointcuts. Поэтому убедитесь, что ваше внутреннее предложение выглядит так:

@within(@MyAnnotation *)

'*' используется для обозначения любого класса. Это та часть, которую вам не хватает в вашем примере.

Другим подходом было бы использование точки @annotation:

@Annotation(@MyAnnotation)

Официальная документация:

https://www.eclipse.org/aspectj/doc/next/adk15notebook/annotations-pointcuts-and-advice.html

person markusw    schedule 22.11.2018
comment
Я использую Spring Aspects. Итак, @Annotation pointcut используется только для методов с SampleAnnotation. Я также пытаюсь использовать within(@SampleAnnotation *), но у него было похожее поведение. Я также пробовал @within(SampleAnnotation *) и @within(@SampleAnnotation *), но оба вызывали исключение времени выполнения - Caused by: java.lang.IllegalArgumentException: Pointcut is not well-formed: - person Sahil Agarwal; 23.11.2018
comment
@annotation работает только для разрезов точек на уровне метода, то есть, если аннотация находится на уровне класса, эти методы не перехватываются. - person Sahil Agarwal; 26.11.2018