Структура проекта
spring-contract
spring-aop
как зависимость от (1)spring-service
как зависимость от (2).
У меня есть аннотация параметра @MyAnnotation
в проекте spring-contract
, класс аспекта в spring-aop
,
package com.learning.aspect;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
@Aspect
public class AnnotatedFieldAspect {
@Before("execution(* *(.., @MyAnnotation (*), ..)) && args(newValue)")
public void advice(JoinPoint jp, Object newValue) {
System.out.println(">>> inspecting "+newValue+" on "+jp.getTarget()+", "+jp.getSignature());
}
}
Класс, который будет указан в аннотации, находится в проекте spring-service
,
package com.learning.fieldtest.service;
public class TestField {
private String name;
public String getName() {
return name;
}
public void setName(@MyAnnotation String name) {
this.name = name;
}
public static void main(String[] args) {
TestField testField = new TestField();
testField.setName("Alex");
testField.m1(testField.getName());
System.out.println(testField.getName());
}
public void m1(@MyAnnotation String string) {
System.out.println("Inside m1() @MyAnnotation" + string);
}
}
Методы класса TestField не помечены как рекомендованные, если я перемещаю все классы в одном пакете, я получаю результат. Есть и другие аспекты, написанные на уровне классов и методов, которые применяются.
>>> inspecting Alex on com.learning.fieldtest.service.TestField@3fa77460, void com.learning.fieldtest.service.TestField.setName(String)
>>> inspecting Alex on com.learning.fieldtest.service.TestField@3fa77460, void com.learning.fieldtest.service.TestField.m1(String)
Inside m1() @MyAnnotationAlex
Alex
Пользовательская аннотация
package com.learning.spring.contract;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.PARAMETER)
public @interface MyAnnotation {
}
execution(* *(.., @com.learning.whatever.MyAnnotation (*), ..))
. - person kriegaex   schedule 09.02.2020execution(* *(.., @com.learning.spring.contract.MyAnnotation (*), ..))
. Вы сказали, что пробовали, но не сообщили о результате. Не очень полезно. Так работает ли это так, как я предлагал? Затем я могу преобразовать свои комментарии в ответ, который вы затем можете принять + проголосовать, чтобы закрыть вопрос. - person kriegaex   schedule 09.02.2020@Before("execution(* com.com.learning.fieldtest.service..*(..))") and @Before("within(com.com.learning.fieldtest.service.*)")
того же предупреждающего сообщения - person tinker_fairy   schedule 09.02.2020