Spring AspectJ 加载时间编织不适用于 5.3.3 和 Tomcat 9.0.37

Spring AspectJ Load Time Weaving not working with 5.3.3 and Tomcat 9.0.37

我参与了一个旧项目的审查任务。任务是将某些库更新到更新的版本。该项目成功地将加载时间编织与 spring (4.3.14.RELEASE) 以及 JDK 8 下的 AspectJ (1.9.0) 和 Tomcat 8.0.20 一起使用。现在 spring 应该更新到最新版本(目前是 5.3.3)并且 Tomcat 版本应该提升到最新版本(目前目标是 9.0.37)。服务器应在 JDK 下 运行 11. 升级库后,我们发现 AspectJ 不再工作。所以我开始对此进行调试。 AspectJ 是从这样的 XML 配置激活的:

<context:load-time-weaver />

在调试容器的启动时偶然发现了org.springframework.context.config.LoadTimeWeaverBeanDefinitionParser中的这段代码:

protected boolean isAspectJWeavingEnabled(String value, ParserContext parserContext) {
    if ("on".equals(value)) {
        return true;
    }
    else if ("off".equals(value)) {
        return false;
    }
    else {
        // Determine default...
        ClassLoader cl = parserContext.getReaderContext().getBeanClassLoader();
        return (cl != null && cl.getResource(AspectJWeavingEnabler.ASPECTJ_AOP_XML_RESOURCE) != null);
    }
}

由于我们没有为 XML 标签提供任何属性,AspectJ 处于自动检测模式,导致执行 else 分支中的代码。那里对类加载器的引用为空,导致 AspectJ 被禁用。

试图通过传递 <context:load-time-weaver aspectj-weaving="on"/> 来显式激活 AspectJ,但最终没有效果。 AspectJ 已设置为活动状态并已加载定义,但检测到 none 的方面定义 (META-INF/aop.xml) 已应用。由于到目前为止我们还没有通过 AspectJ 功能或包结构进行任何更改,因此 spring 从 4.3.14 到 5.3.3) 或 AspectJ(1.9.0 到 1.9.4)一定发生了某些更改。快速查看 GitHub 存储库显示我唯一一个重要的 change。但是调试这个,改之前用的classloader也是null。

有没有人在让 AspectJ 以这种方式工作时遇到过类似的问题?在我看来,问题是检测类路径上的 aop.xml 文件。

编辑: 我使用 JDK 和 Tomcat 版本的不同组合进行了更多研究。问题与这两个无关。当逐个版本升级 spring 时,我发现它在 5.1.20.RELEASE 之前工作正常。从 5.2.0.RELEASE 开始,我的问题就来了。同时,我激活了 AspectJ 日志记录,因此我可以看到一些 类 是编织的,但我希望编织的大多数 类 不是。

这是由于 spring 框架自 5.2.0.RELEASE 以来的回归造成的。 Here 就是这个问题。