1

Spring xml に次の Bean があるとします。

<bean id="mqConnectionFactory" class="com.ibm.mq.jms.MQQueueConnectionFactory">
    <property name="hostName" value="${host}"/>
    <property name="port" value="${mq.port}"/>
</bean>

<bean id="jmsQueueConnectionFactory"
      class="org.springframework.jms.connection.SingleConnectionFactory">
    <property name="targetConnectionFactory" ref="mqConnectionFactory"/>
</bean>

<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
    <property name="connectionFactory" ref="jmsQueueConnectionFactory"/>
</bean>

さまざまなホストにメッセージを送信する必要がありますが、複数のコネクション ファクトリ Bean を定義したくありません。

次のようにホストを指定するとよいでしょう。

class A {
    @Autowired(host="host1")
    private JmsTemplate jmsTemplate;
}

class B {
    @Autowired(host="host2")
    private JmsTemplate jmsTemplate;
}

アップデート:

次の構成を作成できます。

<bean id="mqConnectionFactory1" class="com.ibm.mq.jms.MQQueueConnectionFactory">
    <property name="hostName" value="${host1}"/>
    <property name="port" value="${mq.port}"/>
</bean>

<bean id="mqConnectionFactory2" class="com.ibm.mq.jms.MQQueueConnectionFactory">
    <property name="hostName" value="${host2}"/>
    <property name="port" value="${mq.port}"/>
</bean>

<bean id="jmsQueueConnectionFactory1"
      class="org.springframework.jms.connection.SingleConnectionFactory">
    <property name="targetConnectionFactory" ref="mqConnectionFactory1"/>
</bean>

<bean id="jmsQueueConnectionFactory2"
      class="org.springframework.jms.connection.SingleConnectionFactory">
    <property name="targetConnectionFactory" ref="mqConnectionFactory2"/>
</bean>

<bean id="jmsTemplate1" class="org.springframework.jms.core.JmsTemplate">
    <property name="connectionFactory" ref="jmsQueueConnectionFactory1"/>
</bean>

<bean id="jmsTemplate2" class="org.springframework.jms.core.JmsTemplate">
    <property name="connectionFactory" ref="jmsQueueConnectionFactory2"/>
</bean>

それで:

class A {
    @Resource("jmsTemplate1")
    private JmsTemplate jmsTemplate;
}

class B {
    @Resource("jmsTemplate2")
    private JmsTemplate jmsTemplate;
}

それは間違っていて複雑に思えます。問題は、この構成を減らしてホストをパラメーターとして渡すことです。つまり、Spring に「jmsTemplate を作成し、connectionFactory のプロパティ ホストをこの値に設定してください」と伝えたいのです。

4

2 に答える 2

0

これが私がすることです:

ローカル、開発、本番など、さまざまな環境の接続情報を含むさまざまなプロパティ ファイルがあります。

  • db.local.properties
  • db.dev.properties
  • db.prod.properties

環境変数を設定してアプリケーションを実行するときに、このプロパティ ファイルの 1 つだけを使用しました。

<bean id="dbPlaceholderConfig" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
   <property name="location" value="classpath:db.${db.environment:dev}.properties"/>
</bean>

ここで、値が定義されていない場合に呼び出される環境変数を使用したことがわかります。{db.environment}デフォルトでは、ファイル名を形成する dev になりますdb.dev.properties

次のステップは、アプリケーションを実行するさまざまな環境で変数を定義することです

java -Ddb.environenment=prod ...

私は Tomcat を使用しているので、その変数を で定義しましたがsentenv.sh、他のアプリケーション サーバーが同様のメカニズムを提供していると確信しています。

次に、プロパティファイルによって提供されるパラメーターを使用するコードを作成します

@Value("${db.url}")
private String databaseUrl;
@Value("${db.userName}")
private String userName;
@Value("${db.password}")
private String password;
于 2013-09-23T13:14:05.850 に答える