4

現在、Spring Bean マップにアプリケーション関連のデータがあり、このマップを他のクラスに ref として渡しています。

マップは以下のように定義されています

<bean id="sampleMap" class="java.util.HashMap">
    <constructor-arg index="0" type="java.util.Map">
        <map key-type="java.lang.Integer" value-type="java.lang.Float">
            <entry key="1" value="5"/>
            <entry key="2" value="10"/>
            <entry key="3" value="15"/>             
        </map>
    </constructor-arg>
</bean>

このマップは、他の Bean では次のように参照されます。

<bean id="config" class="com.example.Config" abstract="false">      
    <property name="sampleMap" ref="sampleMap"/>
    .
    .
</bean>

データベーステーブルからマップ値を取得し、それを他のクラスに注入したいだけです。どうすれば春にそれを行うことができますか。基本的に、そのテーブルにはアプリケーション関連のデータが含まれています。マップのキーと値は int,Configuration になります。

構成データをロードするのに最適な場所は? Spring Beanマップを使用できますか、またはデータベースから構成をロードし、サービス、デリゲート、DAOなどのアプリケーションの他の場所でそれを参照するための他の良いアプローチはありますか?

助けていただければ幸いです

ありがとう

4

3 に答える 3

3

春の を使用する必要がありますFactoryBean

public class MyHashMapFactoryBean implements FactoryBean<Map<Integer, Float>>{

  @Autowired
  private Datasource datasource; 

  public Map<Integer, Float> getObject(){
    return <load from database>;
  }

  public Class<Map> getObjectType() { return Map.class ; }

  public boolean isSingleton() { return true; }
}

<bean id="sampleMap" class="my.package.MyHashMapFactoryBean">
  <here you could pass some properties e.g. jdbc datasource>
</bean>
于 2013-02-04T15:35:15.627 に答える
1

FactoryBeanの答えは正しいですが、それは物事を行うための古い方法です

代わりに、@Configurationクラスを使用してください

@Configuration
public class DBConfiguration{

    @Autowired
    private DataSource dataSource;

    @Bean
    public Map<Integer, Float> configMap(){
        // use dataSource to get map values
    }

}

このアプローチの多くの利点の1つは、をDataSource構成クラスに自動配線できることです。

ところで、豆として地図を使用するのは正しくないと感じます。マップの周りにラッパーオブジェクトを作成し、それをSpring Beanとして使用しますが、意見は異なります。

于 2013-02-04T16:49:07.580 に答える
0

今日私が実際に発見したのは、特定のインターフェイスのインスタンスへの Bean 名のマップが必要な場合、@Qualifierやあらゆる種類のFactoryBeanコードは必要ないということです。Spring は、候補を見つけて挿入します。少しの魔法ですが、そのように機能するようです。

于 2014-10-06T13:07:48.010 に答える