SpringAOP@Inject与Maven一起使用,不只是在发布版本中工作

SpringAOP@Inject与Maven一起使用,不只是在发布版本中工作,spring,maven,aop,Spring,Maven,Aop,我使用SpringAOP支持通过@inject将引用注入到SpringBeanFactory未管理的对象中。例如: @Configurable(preConstruction=true) class DefaultContent implements Content { @Inject @Nonnull private Site site; @Inject @Nonnull private ModelFactory modelFactory; p

我使用SpringAOP支持通过@inject将引用注入到SpringBeanFactory未管理的对象中。例如:

@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发布插件的版本,版本中的二进制文件似乎无法注入,因为我在标有“here”的行中得到了一个NPE

为了更好地解释,直到昨天,我的项目还处于快照模式1.0-ALPHA-2-SNAPSHOT。快照中的二进制文件可以正常工作。1.0-ALPHA-2版本的二进制文件,发布模式,不要。下一个快照1.0-ALPHA-3-snapshot中的二进制文件再次工作。唯一的黑洞是释放的双星。从diff来看,除了模块的版本标签之外,快照和发行版之间没有其他区别

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


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

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

@Inject @Nonnull
private Provider<Site> site;
请注意,我在过去的项目中已经使用了一些提供者依赖项,因为我发现自己存在一些无法解决的循环依赖项——通常Spring会显式地给出关于它们的错误通知。因此,这不是对我的帖子的一个完整的答案——考虑在运行快照时不需要进行这种改变;当项目的不相关细节(如快照/发布版本)发生更改时,不可解析的循环依赖项不能是不可解析的或可解析的


所以我想我在春季AOP中触发了一些bug。不过,提供者的事情对我来说是完全可以接受的。

你真的让Spring来做注射吗?IIRC,默认情况下它不会,它只查看bean,尽管您可以使用@Configuration将对象引入Spring并将它们转换为bean。正如我所说的,当Maven模块的版本控制为快照时,代码可以完美地工作。在beans.xml中,有打开注入所需的所有内容,否则它在快照中也无法工作。
site.get()