【问题标题】:How to order @Aspect如何订购@Aspect
【发布时间】:2018-05-18 08:09:21
【问题描述】:

在一个使用大量@Aspect的(Spring boot)应用程序中

  1. 您将如何确保使用 @Order 进行正确的方面排序,因为这些方面可能驻留在不同应用程序使用的不同库中,因此您无法有一个中心位置来定义排序?

  2. 您如何列出应用程序上下文中存在的所有@Aspect,以及它们的顺序?

  3. 在单独的@Aspect 中使用@DeclarePrecedence 来确保排序而不是@Order 对于这种用例是否有意义?

【问题讨论】:

    标签: spring spring-aop


    【解决方案1】:

    我不是 Spring 用户,但 AFAIK @DeclarePrecedence 未在 Spring AOP 中实现,它只影响纯 AspectJ 方面,即如果您将 LTW 与 AspectJ 一起使用,它会起作用,否则您会被 @Order 加上特殊的Ordered.LOWEST_PRECEDENCEOrdered.HIGHEST_PRECEDENCE 之类的值。

    IMO 如果您遇到方面优先级的问题,您的设计就有缺陷。一个方面应该实现一个横切关注点并且独立于其他方面。当然,每条规则都有例外,但那些应该只影响一个库的某些方面,这些方面有时可能是相互依赖的。来自不同库的方面不应该对顺序做出任何假设。因此,如果这是您的代码库中的一个真正问题,而不仅仅是一个理论问题 - 去重构!

    【讨论】:

    • 我不清楚 @DeclarePrecedence 是否被 Spring AOP 授予荣誉,请参阅 jira.spring.io/browse/SPR-2205
    • 对我来说问题是你可以在单独的库中解决横切关注点,例如,如果你有一个专门的库处理分布式跟踪,另一个处理事务,你如何确保哪一个先执行?
    • 为什么这还是个问题?跟踪和事务处理不应相互影响。但只要库是在同一家公司开发的,并且如果您真的认为需要这个,您可以就每个库的数量范围达成一致,在全球范围内阐明哪些库应该比其他库具有更高的偏好。不过,我仍然认为这是一个坏主意。如果人们开始依赖它,您将获得糟糕的相互依赖关系,因为如果有人开始重构方面库,事情就会中断。
    猜你喜欢
    • 2018-03-09
    • 1970-01-01
    • 2012-03-25
    • 2021-08-05
    • 2017-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多