Структура проекта:
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 {
}