Java 带注释字段的Spring AOP切入点表达式

Java 带注释字段的Spring AOP切入点表达式,java,aop,aspectj,spring-aop,Java,Aop,Aspectj,Spring Aop,是否可以捕获具有特定注释的任何字段?我的最终目标是向该字段中注入一个值,但目前我的切入点是错误的(不确定语法是否正确) 我相信切入点是用注释说明任何方法。我想把这一点改为任何领域。我认为你应该听从索蒂里奥斯·德里马诺利斯的建议,尽可能地使用Spring车载方式。如果您仍然认为它们不够充分,并且绝对希望使用方面来实现您的想法,那么您可以使用Spring AOP,而不是使用Spring AOP,并利用切入点的全部功能,如get()和set(),以拦截类成员(静态和非静态)上的读/写操作。例如: 标记

是否可以捕获具有特定注释的任何字段?我的最终目标是向该字段中注入一个值,但目前我的切入点是错误的(不确定语法是否正确)


我相信切入点是用注释说明任何方法。我想把这一点改为任何领域。

我认为你应该听从索蒂里奥斯·德里马诺利斯的建议,尽可能地使用Spring车载方式。如果您仍然认为它们不够充分,并且绝对希望使用方面来实现您的想法,那么您可以使用Spring AOP,而不是使用Spring AOP,并利用切入点的全部功能,如
get()
set()
,以拦截类成员(静态和非静态)上的读/写操作。例如:

标记注释:

set(String de.scrum_master.app.Application.status) -> starting
get(String de.scrum_master.app.Application.status)
Application [id=11, name=AspectJ demo, status=starting]
set(String de.scrum_master.app.Application.status) -> running
get(String de.scrum_master.app.Application.status)
Application [id=22, name=AspectJ field access demo, status=running]
set(String de.scrum_master.app.Application.status) -> shutting down
get(String de.scrum_master.app.Application.status)
Application [id=22, name=AspectJ field access demo, status=shutting down]
set(String de.scrum_master.app.Application.status) -> stopped
get(String de.scrum_master.app.Application.status)
Application [id=22, name=AspectJ field access demo, status=stopped]
package de.scrum\u master.app;
导入java.lang.annotation.ElementType;
导入java.lang.annotation.Retention;
导入java.lang.annotation.RetentionPolicy;
导入java.lang.annotation.Target;
@保留(RetentionPolicy.RUNTIME)
@目标(ElementType.FIELD)
public@interface MyAnnotation{}
驱动程序应用程序:

set(String de.scrum_master.app.Application.status) -> starting
get(String de.scrum_master.app.Application.status)
Application [id=11, name=AspectJ demo, status=starting]
set(String de.scrum_master.app.Application.status) -> running
get(String de.scrum_master.app.Application.status)
Application [id=22, name=AspectJ field access demo, status=running]
set(String de.scrum_master.app.Application.status) -> shutting down
get(String de.scrum_master.app.Application.status)
Application [id=22, name=AspectJ field access demo, status=shutting down]
set(String de.scrum_master.app.Application.status) -> stopped
get(String de.scrum_master.app.Application.status)
Application [id=22, name=AspectJ field access demo, status=stopped]
应用程序读取(
toString()
)并写入(构造函数、主方法)所有字段,其中包括带注释的
状态
字段

package de.scrum\u master.app;
公共类应用程序{
私有int-id;
私有字符串名称;
@MyAnnotation私有字符串状态;
公共应用程序(int-id、字符串名称、字符串状态){
this.id=id;
this.name=名称;
这个状态=状态;
}
@凌驾
公共字符串toString(){
返回“Application[id=“+id+”,name=“+name+”,status=“+status+”]”;
}
公共静态void main(字符串[]args){
应用程序=新应用程序(11,“AspectJ演示”,“启动”);
System.out.println(应用程序);
application.id=22;
application.name=“AspectJ现场访问演示”;
application.status=“正在运行”;
System.out.println(应用程序);
application.status=“正在关闭”;
System.out.println(应用程序);
application.status=“已停止”;
System.out.println(应用程序);
}
}
方面:

set(String de.scrum_master.app.Application.status) -> starting
get(String de.scrum_master.app.Application.status)
Application [id=11, name=AspectJ demo, status=starting]
set(String de.scrum_master.app.Application.status) -> running
get(String de.scrum_master.app.Application.status)
Application [id=22, name=AspectJ field access demo, status=running]
set(String de.scrum_master.app.Application.status) -> shutting down
get(String de.scrum_master.app.Application.status)
Application [id=22, name=AspectJ field access demo, status=shutting down]
set(String de.scrum_master.app.Application.status) -> stopped
get(String de.scrum_master.app.Application.status)
Application [id=22, name=AspectJ field access demo, status=stopped]
package de.scrum\u master.aspect;
导入org.aspectj.lang.JoinPoint;
导入org.aspectj.lang.annotation.Aspect;
导入org.aspectj.lang.annotation.Before;
@面貌
公共类注释字段方面{
@在(“get(**)&&&@annotation(de.scrum\u master.app.MyAnnotation)”之前
public void interceptRead(连接点-此连接点){
System.out.println(此连接点);
}
@在(“set(**)&&&@annotation(de.scrum\u master.app.MyAnnotation)和&args(newValue)”之前
public void interceptWrite(JoinPoint thisJoinPoint,Object newValue){
System.out.println(thisJoinPoint+“->”+新值);
}
}
控制台日志:

set(String de.scrum_master.app.Application.status) -> starting
get(String de.scrum_master.app.Application.status)
Application [id=11, name=AspectJ demo, status=starting]
set(String de.scrum_master.app.Application.status) -> running
get(String de.scrum_master.app.Application.status)
Application [id=22, name=AspectJ field access demo, status=running]
set(String de.scrum_master.app.Application.status) -> shutting down
get(String de.scrum_master.app.Application.status)
Application [id=22, name=AspectJ field access demo, status=shutting down]
set(String de.scrum_master.app.Application.status) -> stopped
get(String de.scrum_master.app.Application.status)
Application [id=22, name=AspectJ field access demo, status=stopped]

你所说的捕获任何字段是什么意思?Spring(基于代理的)AOP只能用于拦截方法调用。这一点非常好。所以,也许我的方法应该是在该字段的setter方法上设置切入点?您提到过注入。你为什么不使用内置的自动布线机制?我可以。我只是尝试用特定的和自定义的注释来填充特定字段的注入。