0

Spring Bean として定義されたいくつかの異なるデータソースがあるとします。

<bean id="dataSource1" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://localhost/db1?user=root&amp;password=password" />
</bean>

<bean id="dataSource2" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://localhost/db2?user=root&amp;password=password" />
</bean>

ここで、これらのデータソース Bean の 1 つを使用したいと思いますが、Spring Bean 以外のコンテナーからのものです。appContext.getBean("dataSource1") を呼び出すこともできますが、コード内のスプリング フレームワークへの明示的な依存関係が作成されるため、これは悪い習慣であると読みました。実装固有ではない方法でこれを達成するためのより良い方法はありますか? おそらく DatasourceFactory.getInstance("datasource1") のようなものでしょうか?

これは奇妙な要求ですか?コンテナー クラスが Spring Bean の場合、標準の依存性注入を使用するだけでよいため、これは非常に簡単であることがわかりました。しかし、これは私が興味を持っていたものです。依存性注入を使用すると無限ループが作成されるようです。クラスでSpring Beanを使用する場合、そのクラスもBeanである必要があり、別のクラスがそのBeanを使用したい場合は、それもBeanである必要があります.などなど。依存性注入チェーンを壊すエレガントな方法がわかりません。

繰り返しますが、チェーンを壊す必要はないかもしれません。答えは、すべてのクラスをSpring Beanにすることかもしれませんが、私はただ興味がありました.

ここでサービス ロケーター パターンを適用できますか? もしそうなら、誰かが例を提供できますか?ありがとう。

4

1 に答える 1

1

あなたが説明する方法は、それを行うための古典的な方法です。

public class UnmanagedBean {
    public UnmanagedBean(DataSource dataSource) {
       ... // do something
    }
} 

...

ApplicationContext context = ...;
DataSource dataSource2 = context.getBean("dataSource2");
UnmanagedBean bean = new UnmanagedBean(dataSource2);

BeanProviderこれを行うクラスを使用して抽象化のレベルを追加できますが、 ApplicationContext.

于 2013-10-10T15:45:07.673 に答える