我无法以特定顺序触发多个方面。我正在使用 RequestProcessor 对控制器上的每个传入请求执行某些操作,这些请求具有特定参数
然后我有一些特定的注释,我将只添加到我的控制器中的某些方法中。
仅供参考,我正在使用 Eclipse、Tomcat、Maven 和 spring 以及基于 java/annotation 的配置。我使用 Tomcat 和 WebApplicationInitializer 来加载我的上下文、调度程序、侦听器等。我没有 web.xml。如果需要,我也可以发布它或 pom.xml。
我遇到的问题是,一个既满足ProcessRequest
切入点又满足someAnnotation
切入点的方法首先触发该someAnnotation
方法,即使指定了首先触发的顺序ProcessRequest
。中设置了ProcessRequest
一些其他注释中需要的属性。
这是我的代码的简化版本。
Spring 配置类
@Configuration // Enable Spring Annotation Configuration. Equivalent to <context:annotation-config/>
@EnableAspectJAutoProxy
@EnableCaching // Enable Spring caching
@EnableWebMvc // Enable Spring MVC Annotation. Equivalent to <mvc:annotation-driven />.
@ComponentScan(basePackages = {"xxx.yyy.zzz"}) // Scan for Spring Components. Equivalent to <context:component-scan>
public class WebAppConfig extends WebMvcConfigurerAdapter {
// Other Bean logic here
@Bean
public RequestProcessor requestProcessor() {
return new RequestProcessor();
}
@Bean
public AnnotationAspect annotationAspect() {
return new AnnotationAspect();
}
}
方面#1
@Aspect
@Order(0)
public class RequestProcessor {
@Pointcut("execution(* xxx.yyy.zzz.api..*.*(xxx.yyy.zzz.objects.api.Request,..)) && args(request)")
public void pointcut(Request<?> request) {}
@Before("pointcut(request)")
public void processRequest(Request<?> request) throws IOException, BadSignatureException {
// Some logic here that is independent of other and needs to run before other aspect which references annotation
}
}
方面#2
@Aspect
@Order(1)
public class AnnotationAspect {
@Before("@annotation(xxx.yyy.zzz.annotation.SomeAnnotation)")
public void someAnnotation() {
// Log for this annotation
}
// Some other annotation methods here
}
也试过这种格式implements Ordered
@Aspect
public class RequestProcessor implements Ordered {
@Override
public int getOrder() {
return 0;
}
@Pointcut("execution(* xxx.yyy.zzz.api..*.*(xxx.yyy.zzz.objects.api.Request,..)) && args(request)")
public void pointcut(Request<?> request) {}
@Before("pointcut(request)")
public void processRequest(Request<?> request) throws IOException, BadSignatureException {
// Some logic here that is independent of other and needs to run before other aspect which references annotation
}
}
我阅读了这篇文章和其他一些文章,但找不到任何相关的内容。
****更新****
所以我一直在阅读关于声明优先级的 AspectJ 文档,所以我想我会试一试。我创建了一个只声明优先级的简单方面,它工作得很好。
这是我的优先方面:
public aspect AspectPrecedence {
declare precedence : RequestProcessor, SomeAspect;
}
我暂时不打算将此作为答案提交,因为我想了解为什么注释或“已订购的实现”在我的项目中无法正常运行。
任何见解将不胜感激。谢谢!
****更新2****
作为参考,这在我的 eclipse 环境中本地工作,并且在通过 WAR 文件部署到 AWS 时似乎工作。
@Aspect
@DeclarePrecedence("RequestProcessor, SomeAspect")
public class RequestProcessor {
@Pointcut("execution(* xxx.yyy.zzz.api..*.*(xxx.yyy.zzz.objects.api.Request,..)) && args(request)")
public void pointcut(Request<?> request) {}
@Before("pointcut(request)")
public void processRequest(Request<?> request) throws IOException, BadSignatureException {
// Some logic here that is independent of other and needs to run before other aspect which references annotation
}
}