因为 Spring 驱动的 AspectJ LTW 无法编织在 Spring 初始化之前加载的类,所以我将 Spring 项目转换为纯 Aspectj LTW(使用 AspectJ weaver java 代理)。
但是,这同时在我们的单元测试中启用了 AOP,因为我需要将 AspectJ 的代理添加到 Maven Surefire 插件 argLine 参数以及我团队的 IDE (IntelliJ IDEA) 中的默认 TestNG 配置。
如果我们的 Aspects 不依赖于 Spring,这不会成为问题,但是其中一些实际上需要通过 @Resource 表示法将 Spring bean 注入到它们的字段中。由于在单元测试期间未启动 Spring,因此该字段将为 null 并导致 NullPointerExceptions。
尽管我可以在构建过程中配置 Surefire 插件的两个独立执行:一个有代理,另一个没有它;这个解决方案将变得不切实际,因为每个开发人员仍然需要更改 IDE 的单元测试测试配置,而不是实际需要 AOP 和启动 Spring 的其他测试,对于每个独立的测试执行(即在 Maven 构建过程之外)。
为了解决这个问题,最好的方法是什么?有什么方法可以禁用 AspectJ 的 LTW,同时仍然保持 Java 代理配置不变?或者也许是另一种更灵活的方式来配置不存在 Spring 驱动的 AspectJ LTW 问题的 AspectJ 的 LTW?