Java @@Configuration bean中的Autowired bean属性为null

Java @@Configuration bean中的Autowired bean属性为null,java,spring,Java,Spring,我对@Configuration bean中的@Autowired属性有问题 我有一个类似于下面的bean: @Configuration public class MyConfig { @Autowired MongoTemplate mongoTemplate; @Bean MongoDbMetadataStore indexMetadataStore() { return new MongoDbMetadataStore(mongoTemplate

我对@Configuration bean中的@Autowired属性有问题

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

@Configuration
public class MyConfig {
    @Autowired MongoTemplate mongoTemplate;

    @Bean
    MongoDbMetadataStore indexMetadataStore() {
        return new MongoDbMetadataStore(mongoTemplate, "index");
    }
}
而且。。。mongoTemplate在创建IndexMetadatastorebean时为null(通过调试器检查)。不幸的是,我不能提供整个项目结构,它很大(它有~5个XML配置文件和大约20-30个@Configuration bean),我打赌可能会有一个循环引用或类似的东西

但是,这个MongoTemplatebean是在前面创建的,并被注入到其他bean中(也通过调试器进行了检查),因此此时mongoTemplate已完全创建,我无法理解为什么它没有被注入并保留为null


你知道我应该去哪里吗?

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

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

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

  • 首先初始化
    @Resource
    ,初始化顺序与
    @Configuration
    bean中声明对象的顺序相同
  • @Value
    被视为
    @Autowired
    。因此,在初始化所有
    @Resource
    bean之后,
    @Value
    @Autowired
    按出现顺序初始化
  • 理解上述顺序很重要,因为您的bean和循环引用可能依赖于
    @Value
    设置,并且在创建从其他配置bean引用的资源时,此类设置可能仍然是
    null


    然而,最好的策略是避免循环引用,最后我就是这么做的——将有问题的资源放到新的第三个配置bean中。

    order语句似乎是正确的。我的@Configuration bean中有许多@Autowired属性。当试图在my@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;
    }
    
    @配置
    公共类MyConfig{
    @自动连线
    私人MyClass MyClass;
    @自动连线
    私人密级2密级2;
    ...
    @自动连线
    私人MyArgument1 MyArgument1;
    @自动连线
    私人MyArgument2 MyArgument2;
    @Bean(name=“myList”)
    公共列表getMyList(){//给定MyArgument1和MyArgument2实现MyInterface
    List myList=new ArraList();
    myList.add(myArgument1);//解析为null
    myList.add(myArgument2);//解析为null
    返回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;
    }
    
    @配置
    公共类MyConfig{
    @自动连线
    私人MyClass MyClass;
    @自动连线
    私人密级2密级2;
    ...
    @Bean(name=“myList”)
    公共列表getMyList((@Qualifier(“myArgument1”)MyInterface myArgument1,(@Qualifier(“myArgument2”)MyInterface myArgument2){//给定myArgument1和myArgument2正确标记为@Component(“myArgument1”)和@Component(“myArgument2”)
    List myList=new ArraList();
    myList.add(myArgument1);//已解决!
    myList.add(myArgument2);//已解决!
    返回myList;
    }
    
    }


    这似乎实现了组件扫描中包含的MyConfig类的正确依赖项

    包?您可能需要使用
    @AnnotationDrivenConfig
    注释。没有看到完整的示例,这只是猜测。注释
    @AnnotationDrivenConfig
    似乎已在Spring 4中删除。