2016-09-24 16 views
1

私はSpringBoot MVCアプリケーションを使用します。 私は@Configurationクラスを持っていて、ApplicationContextにbeanを初期化するクラスは@Beanです。 @Autowired注釈を使用してBeanをオートワイヤリングしようとしている@Controllerクラスがあります。@Autowiredの後にSpring @Beanメソッドを実行する

結果:@Autowiredフィールドはnullです。

DEBUG:実行順序を確認するためにデバッグしようとしました。私は、@Configurationで注釈を付けられたクラスがBeanをアプリケーションコンテキストに初期化するために最初に実行されることを期待していました。しかし、コントローラクラスが最初にインスタンス化されました。その後、@Beanメソッドのクラスが次に呼び出されました。このBeanはコントローラの後にインスタンス化されているため、コントローラがBeanを自動取得しないのはこのためです。

質問:コントローラクラスのインスタンス化の前に@Configuration@Beanメソッドを実行する方法はありますか?


設定クラスのコード:

@Configuration 
public class RootConfiguration2 { 

    @Autowired 
    private IService<ActBinding> bindingService; 

    @Bean 
    public Map<String, String> getBingindNameToRoutingKeyMap() throws Exception { 
     ListOperation<ActBinding> operation = ListOperation.from("key", "name", "exchangeId"); 
     operation.sort("key", SortOrder.Ascending); 
     Iterable<ActBinding> result = bindingService.list(operation).getResult(); 
     Map<String, String> bindingNameToRoutingKey = new HashMap<>(); 
     result.forEach(x -> bindingNameToRoutingKey.put(x.getName(), x.getKey())); 
     return Collections.unmodifiableMap(bindingNameToRoutingKey); 
    } 
} 
+0

あなたは構成クラスコードを共有できますか? –

+0

ロギングをオンにして、警告メッセージを確認します。 – OrangeDog

+0

IService のコードを表示し、getBingindNameToRoutingKeyMapを挿入する場所を指定する必要があります。このようなエラーについては言及していませんが、循環依存である可能性があります。インジェクションgetBingindNameToRoutingKeyMapと@Autowring(required = false)が組合わされていると、タイプミスが発生する可能性があります。 – alexbt

答えて

2

私は2つの回避策を見つけました。両方のソリューションが動作しました。 1. @Autowiredの代わりに@Resourceを使用して、Beanをコントローラに注入します。 2. Configurationクラスの@Beanでアノテーションされたメソッドで@PostConstructを使用します。

注:両方の変更を行う必要はありません。それらのいずれかが動作するはずです。

関連する問題