2016-11-22 11 views
1

@Configuration beanの@Autowiredプロパティに問題があります。@Configuration Beanの@Autowired Beanプロパティがnullです。

私は次のようなBeanを持っている:indexMetadataStore豆(デバッガで確認を)作成中

@Configuration 
public class MyConfig { 
    @Autowired MongoTemplate mongoTemplate; 

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

と... mongoTemplateはnullです。残念ながら、私はプロジェクトの構造全体を提供することはできません。大規模で(約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

[OK]をクリックして問題が見つかりました。ここで説明するので、おそらく他の人がこの回答を参考にして貴重な時間を節約できるかもしれません:)。

循環参照があり、完全に初期化されていない設定オブジェクトを初期化して使用するためにSpringが最善を尽くしていることが判明しました。お互いからオブジェクトを使用したconfig1config2豆(両方とも@Configuration)がありました。

このような状況の春に、次の順序で@Resource@Autowired@Valueを初期化しようとすることを知っているのは興味深いです:

  1. @Resourceは、オブジェクトが@Configuration豆で宣言された順序で、最初に初期化されます
  2. @Valueは、@Autowiredとして処理されます。したがって、@Value@Autowiredは、すべて@ResourceのBeanが初期化された後に表示される順に初期化されます。

あなたの豆と循環参照が@Value設定し、このような設定に依存している可能性があるため、他のコンフィグ豆から参照されるリソースを作成中に、まだnullであってもよいし、上記の順序を理解することが重要です。

しかし、循環参照を避けることが最善の戦略であり、最後にそれが私のやり方です。

関連する問題