项目结构为
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 {
}