2017-03-14 12 views
1

2つの@Configurationクラスの注文を強制することは可能ですか? queueを聞くことになっているSpring `@ Configuration`クラスの注文

@Bean 
public SimpleMessageListenerContainer container(ConnectionFactory connectionFactory) { 
    SimpleMessageListenerContainer container = 
      new SimpleMessageListenerContainer(connectionFactory); 
    container.setQueueNames("queue"); 
    return container; 
} 

:私が持っている

ケース(ConsumerConfiguration)設定クラスの一つで、私は@BeanSimpleMessageListenerContainerで宣言することです。 (これはSpring Integration + AMQPプロジェクトの一部です)

私の想定では、すべてのRabbitコンポーネントは事前に作成され、通常はJavaで宣言したくありません。しかし、私は私のためにそれらを作成するためのアプリケーションを希望devプロファイルのため、それ故に別の@Configurationクラス:私は、アプリケーションを実行すると

@Configuration 
@RequiredArgsConstructor 
@Profile("dev") 
public class ConsumerBindingConfiguration { 


    @Bean 
    public Exchange exchange() { 
     return ExchangeBuilder.topicExchange("exchange") 
       .durable() 
       .build(); 
    } 

    @Bean 
    Queue queue() { 
     return QueueBuilder.durable("queue") 
       .build(); 
    } 

    @Bean 
    Binding binding() { 
     return BindingBuilder.bind(queue()) 
       .to(exchange()) 
       .with("key") 
       .noargs(); 
    } 
} 

残念ながら、ConsumerConfigurationクラスが最初に実行されています。 @Order注釈が@Configurationクラスでは機能していないようです。私は@DependsOn注釈を見ましたが、私の場合は使用できません(dev以外のプロファイルでは、キューを宣言したくありません)。

+0

あなたは「最初の実行」とはどういう意味ですか?それはなぜ問題なのですか? Springはまず、Beanのインスタンス化を開始する前に、すべてのクラスからすべてのBean定義を作成します。 –

+0

あなたのコードに 'AmqpAdmin'がありません:http://docs.spring.io/spring-amqp/reference/html/_reference.html#broker-configuration –

+0

ありがとう@GaryRussell、あなたのコメントは私の考えを得ました..私はそれを反映したサンプルプロジェクトを作成し始めました。同じ名前のBean(別の 'exchange()'、 'queue()'、 'binding()')で別の 'BindingConfiguration'を持っていました。重複した名前をすべて解決したら... 楽しい事実:コンフィグレーションクラス名に依存する最初のコンフィグレーションまたは他のコンフィグレーションから 'queue()' beanを読み込みました。 –

答えて

0

あなたは使用を試すことができます。

@Configuration 
@Import({ConsumerBindingConfiguration.class}) 
public class ConsumerConfiguration 
+0

それは役に立たなかった。 –

関連する問題