2016-11-22 166 views
1

我在@Configuration bean中有@Autowired屬性有問題。@Configuration bean中的@Autowired bean屬性爲空

我有類似下面的一個豆:

@Configuration 
public class MyConfig { 
    @Autowired MongoTemplate mongoTemplate; 

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

和... mongoTemplate是在創建indexMetadataStore豆(含調試檢查)空。不幸的是,我不能提供完整的項目結構,它很大(它有~5個XML配置文件和大約20-30個@Configuration bean),我敢打賭,可以有循環引用或其他類型的東西。

但是,這個mongoTemplate bean是先前創建的,並注入到其他bean(也用調試器檢查過),所以此時mongoTemplate完全創建,我無法理解爲什麼它沒有被注入並留空。

任何想法,我應該看看?

+0

包的MyConfig類包含在您的組件掃描? –

+0

您可能需要使用'@ AnnotationDrivenConfig'註釋。沒有看到一個完整的例子,它只是猜測。 http://docs.spring.io/spring-javaconfig/docs/1.0.0.M4/reference/html/ch04s02.html –

+0

註解'@ AnnotationDrivenConfig'似乎在Spring 4中已被刪除。 –

回答

1

好吧,我發現了一個問題。我會在這裏描述它,這樣也許別人可能會發現這個答案有用,並節省寶貴的時間來解決它:)。

事實證明,有一個循環引用和Spring正在盡其最大努力來初始化和使用未完全初始化的配置對象。有config1config2 beans(兩個@Configuration),它們使用彼此的對象。

有趣的是,要知道,在這種情況下春嘗試按以下順序初始化@Resource@Autowired@Value

  1. @Resource首先被初始化,因爲對象是在@Configuration豆聲明的順序
  2. @Value被視爲@Autowired。因此,@Value@Autowired按照外觀順序初始化後,所有@Resource bean都被初始化。

重要的是要理解上面的命令,因爲你的豆類和循環引用可以依靠@Value設置,這樣的設置仍可能null而創建從其他配置豆引用的資源。

但是,最好的策略是避免循環引用,最後這就是我所做的 - 將違規資源放入新的第三個配置bean。