我已经创建了两个自定义的spring @annotations
。我需要在方法级别而不是类级别定义这些注解的顺序。@order
也可以在方法级别工作吗?
@Aspect
@Component
public class ABC {
private ThreadLocal<logDTO> myThreadLocal;
@Before("@annotation(CommunicationLogInit)")
public void CampaignLogsInit(){
myThreadLocal = new ThreadLocal<logDTO>();
myThreadLocal.set(new logDTO());
}
@Around("@annotation(CommunicationAudit)")
public Object generateLog(ProceedingJoinPoint joinPoint) throws Throwable {
MethodSignature signature = (MethodSignature)joinPoint.getSignature();
Method method = signature.getMethod();
int counter = 0;
for(Parameter parameter : method.getParameters()){
Annotation eventName = parameter.getAnnotation(EventName.class);
Annotation rtnInfo = parameter.getAnnotation(RtnInfo.class);
if(eventName!=null){
System.out.println(joinPoint.getArgs()[counter]);
myThreadLocal.get().setName("ABC");
}
}
}
}
1条答案
按热度按时间pn9klfpd1#
Spring AOP手册在建议排序一节中回答了你的问题:
建议排序
当多条建议都想在同一个连接点运行时会发生什么呢?SpringAOP遵循与AspectJ相同的优先级规则来确定建议执行的顺序。(因此,给定两条before建议,优先级最高的建议首先运行)。从连接点“出去”时,优先级最高的建议最后运行(因此,如果有两条after建议,则优先级最高的建议将排在第二位)。
当两个在不同方面定义的建议都需要在同一个连接点运行时,除非你另外指定,否则执行的顺序是未定义的。你可以通过指定优先级来控制执行的顺序。这可以通过在方面类中实现
org.springframework.core.Ordered
接口或者用Order注解来注解它,以正常的Spring方式来完成。给定两个方面,从Ordered.getValue()
(或注解值)返回较低值的方面具有较高的优先级。当在同一个方面定义的两条建议都需要在同一个连接点运行时,顺序是未定义的(因为没有办法通过java编译的类的反射来检索声明顺序)。考虑将这样的建议方法折叠成每个方面类中每个连接点的一个建议方法,或者将建议重构成您可以在方面级别排序的单独的方面类。
我想最后一段你特别感兴趣。