2016-06-14 15 views
2

私はそのような春のブートテストを持っている:SpringApplicationConfigurationでの設定クラスの宣言の順序。春ブーツは

@RunWith(SpringJUnit4ClassRunner.class) 
@SpringApplicationConfiguration(classes = { 
    PropertyConfig.class, 
    ServiceConfigA.class, 
    ServiceConfigB.class} 
) 
public class SpringTest { 

    @Test 
    public void test() { 
    ... 
    } 
} 

ときPropertyConfig内部の豆は無視され、サービスのconfigsから豆がいくつかのフィールドをautowireすることはできませんので、私はコンテキスト初期化エラーを取得するクラスのリストで最初に宣言PropertyConfigクラス。私がPropertyConfigをserivceの設定の後に移動させた後、PropertyConfigの中のbeanを初期化しました。

さらに詳しくは、PropertyConfigには、2つの豆、PropertiesFactoryBeanおよびPropertySourcesPlaceholderConfigurerが含まれています。原因はPropertySourcesPlaceholderConfigurerは存在しません。サービスコンフィグからのbeanは、@Value注釈付きのフィールドをautowiredできませんでした(文字列から整数への自動変換はできません)。

私の質問は、PropertyConfigの豆が最初のケースで初期化されない理由です。 Springブートテストで設定ロードのいくつかの機能はありますか?

+0

あなたの 'PropertySourcesPlaceholderConfigurer'豆' static'があなたのために働くように私のヒントはありましたか? –

答えて

0

バネスキャンは依存関係をCIコンテナに登録し、初期化の順序を示します。あなたが指している順序は全く関係がありません。

あなたのために失敗している場合は、配線にその他の問題があることがあります。しかし、あなたは私たちにあなたのコードを示していないので、根本的な原因を説明するのは難しいです。

0

@BeanのJavadocの "@Bean方法をBeanFactoryPostProcessorを返す" セクションを参照してください:

特別な配慮は 春BeanFactoryPostProcessor(BFPP)型を返す@Bean方法のために取られなければなりません。 BFPPオブジェクト は、コンテナのライフサイクルの早い段階でインスタンス化する必要があるため、@Autowired、@Value、 などの注釈の処理や@Configurationクラス内の@PostConstructを妨害する可能性があります。これらのライフサイクルの問題を回避するには、BFPPを返す@Beanメソッドをstaticとしてマークします。 例えば:

@Bean 
public static PropertyPlaceholderConfigurer ppc() { 
    // instantiate, configure and return ppc ... 
} 

静的としてこのメ​​ソッドをマーキングすることにより、このよう 、その宣言@Configurationクラスのインスタンス化を引き起こす、上記のライフサイクルの競合を回避することなく起動することができます。ただし、 静的@Beanメソッドは、スコープとAOP セマンティクスのために上で述べたように拡張されません。 は通常、他の@Beanメソッドによって参照されないため、これはBFPPのケースで機能します。注意して、 BeanFactoryPostProcessorに代入可能な戻り値の型を持つ非静的な@Beanメソッド に対して、WARNレベルのログメッセージが発行されます。言い換えれば

はあなたの PropertiesFactoryBeanPropertySourcesPlaceholderConfigurer豆が staticとして宣言されていることを確認し、それが動作するはずです。

関連する問題