@Autowired bean属性在@Configuration bean中为null

时间:2016-11-22 13:40:12

标签: java spring

我在@Configuration bean中遇到@Autowired属性问题。

我有一个类似于下面的bean:

@Configuration
public class MyConfig {
    @Autowired MongoTemplate mongoTemplate;

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

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

但是,这个mongoTemplate bean是先创建的并注入其他bean(也用调试器检查),所以此时mongoTemplate已完全创建,我无法理解为什么它没有注入并保留为null。

我应该看看哪些想​​法?

2 个答案:

答案 0 :(得分:1)

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

事实证明,有一个循环引用,Spring正在尽最大努力初始化并使用未完全初始化的配置对象。有config1config2个bean(两个@Configuration)使用彼此的对象。

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

  1. @Resource首先按照在@Configuration bean中声明对象的顺序进行初始化
  2. @Value被视为@Autowired。因此,@Value@Autowired会在所有@Resource bean初始化后按照出现的顺序进行初始化。
  3. 了解上面的顺序非常重要,因为bean和循环引用可能依赖于@Value设置,并且在创建从其他配置bean引用的资源时,此类设置可能仍为null

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

答案 1 :(得分:0)

订单声明似乎是正确的。我的@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;
}

}

这似乎实现了正确的依赖关系