繁体   English   中英

@Configuration bean 中的@Autowired bean 属性为空

[英]@Autowired bean property is null in @Configuration bean

@Configuration bean 中的 @Autowired 属性有问题。

我有一个类似于下面的豆子:

@Configuration
public class MyConfig {
    @Autowired MongoTemplate mongoTemplate;

    @Bean
    MongoDbMetadataStore indexMetadataStore() {
        return new MongoDbMetadataStore(mongoTemplate, "index");
    }
}

并且 ... mongoTemplate 在创建 indexMetadataStore bean 时为 null(用调试器检查)。 不幸的是,我无法提供整个项目结构,它很大(它有大约 5 个 XML 配置文件和大约 20-30 个 @Configuration bean),我敢打赌可能会有循环引用或类似的东西。

然而,这个 mongoTemplate bean 是更早创建的并注入到其他 bean(也用调试器检查),所以此时 mongoTemplate 已完全创建,我不明白为什么它没有注入并留空。

我应该在哪里看的任何想法?

好的,我发现了一个问题。 我将在这里描述它,以便其他人可能会发现这个答案有用并节省解决它的宝贵时间:)。

结果证明存在循环引用,Spring 正在尽最大努力初始化和使用未完全初始化的配置对象。 config1config2 bean(都是@Configuration ),它们使用彼此的对象。

有趣的是,在这种情况下,Spring 会尝试按以下顺序初始化@Resource@Autowired@Value

  1. @Resource首先初始化,按照对象在@Configuration bean 中声明的顺序
  2. @Value被视为@Autowired 因此, @Value@Autowired在所有@Resource bean 初始化之后按照出现的顺序进行初始化。

理解上述顺序很重要,因为您的 bean 和循环引用可能依赖于@Value设置,并且在创建从其他配置 bean 引用的资源时,此类设置可能仍然为null

然而,最好的策略是避免循环引用,最后这就是我所做的 - 将违规资源放到新的第三个配置 bean 中。

订单声明似乎是正确的。 我的 @Configuration bean 中有许多 @Autowired 属性。 尝试在我的 @Bean 中使用它们时,列表末尾的那些显示为 null。

@Configuration
public class MyConfig {
  @Autowired 
  private MyClass myClass;
  @Autowired 
  private MyClass2 myClass2;
  ...
  @Autowired 
  private MyArgument1 myArgument1;
  @Autowired 
  private MyArgument2 myArgument2;

  @Bean(name = "myList")
  public List<MyInterface> getMyList() { //given MyArgument1 & MyArgument2 implement MyInterface
    List<MyInterface> myList= new ArraList<MyInterface>();

    myList.add(myArgument1); //resolved as null 
    myList.add(myArgument2); //resolved as null

    return myList;
}

}

如果我把它们放在列表的顶部,它们就会得到正确的解决。 那么..我应该指望正确解决多少? 需要更好的方法。

这是工作

@Configuration
public class MyConfig {
  @Autowired 
  private MyClass myClass;
  @Autowired 
  private MyClass2 myClass2;
  ...

  @Bean(name = "myList")
  public List<myInterface> getMyList((@Qualifier("myArgument1") MyInterface myArgument1, (@Qualifier("myArgument2") MyInterface myArgument2) { //given myArgument1 & myArgument 2 are properly labeled as @Component("myArgument1") & @Component("myArgument2")

    List<myInterface> myList= new ArraList<myInterface>();

    myList.add(myArgument1); //resolved!
    myList.add(myArgument2); //resolved!

    return myList;
}

}

这似乎实现了正确的依赖

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM