【问题标题】:Spring-AOP @Inject with Maven not working only in release buildsSpring-AOP @Inject 与 Maven 仅在发布版本中工作
【发布时间】:2011-08-12 02:15:46
【问题描述】:

我正在使用 Spring-AOP 支持通过 @Inject 将引用注入到不受 Spring beanfactory 管理的对象中。例如:

@Configurable(preConstruction=true)
class DefaultContent implements Content 
  {
    @Inject @Nonnull
    private Site site;

    @Inject @Nonnull
    private ModelFactory modelFactory;

    public DefaultContent (final @Nonnull FileObject file)
      {
        resource = modelFactory.createResource(file);   // <--here
      }

我正在使用静态代码编织。

我想我对所有相关技术都很了解,而且这确实可以正常工作……在正常的开发周期中(使用 Maven)。昨天我准备了一个版本(使用 Maven 发布插件),并且该版本中的二进制文件似乎无法注入,因为我在标有“这里”的行处获得了 NPE。

为了更好地解释,直到昨天我的项目还处于 SNAPSHOT 模式 (1.0-ALPHA-2-SNAPSHOT)。快照工作的二进制文件。来自 1.0-ALPHA-2 的二进制文件,发布模式,不要。下一个快照 1.0-ALPHA-3-SNAPSHOT 中的二进制文件再次工作。唯一的黑洞是已发布的二进制文件。用 diff 看,SNAPSHOT 和 release 之间没有其他区别,只是模块的版本标签。

到目前为止,我已经排除了问题是由于 Maven 发布过程中的一些奇怪的事情造成的,因为即使我在“普通”构建中从标记的源重新创建 1.0-ALPHA-2 时,二进制文件也有问题(也就是说,只需 mvn clean install)。我还使用 Java 反编译器来查看错误类的有效源(挥动后),比较来自 1.0-ALPHA-2 和 1.0-ALPHA-3-SNAPSHOT 的代码。它们看起来相同。最后,我比较了二进制文件(一个在 Jetty 中运行的 .war 文件),它们包含相同的项目(也就是说,没有缺少依赖项,唯一的区别是我的 jar 文件具有不同的版本)。

我需要一些建议来更好地理解这个错误,因为目前我不知道还能尝试什么。

【问题讨论】:

  • 你真的要求 Spring 进行注入吗? IIRC,默认情况下它不会(并且它只查看 beans,尽管您可以使用 @Configuration 将对象引入 Spring 并将它们转换为 bean)。
  • 正如我所说,当 Maven 模块被版本化为 SNAPSHOT 时,代码可以完美运行。在 beans.xml 中有打开注入所需的所有东西(否则它在 SNAPSHOT 中也不起作用)。

标签: spring maven aop


【解决方案1】:

我可以通过将列出的依赖项(以及其他一些依赖项)更改为:

@Inject @Nonnull
private Provider<Site> site;

Provider 是一种注入“惰性”依赖项的方法,必须将其延迟为

site.get()

请注意,过去我已经在我的项目中使用了一些 Provider 依赖项,因为我检测到自己存在一些无法解决的循环依赖项——通常 Spring 会明确给出有关它们的错误通知。所以这不是对我的帖子的完整答案 - 考虑到在运行 SNAPSHOT 时不需要此更改;当项目的不相关细节(例如 SNAPSHOT/release 版本)发生更改时,无法解析的循环依赖不能是不可解析的或可解析的......

所以我想我在 Spring AOP 中触发了一些错误。不过,Provider 对我来说是完全可以接受的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-27
    • 1970-01-01
    • 2013-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多