Spring bean映射与动态键和值

时间:2013-02-04 15:21:22

标签: java spring hashmap spring-ioc

现在我在spring bean map中有应用程序相关数据,并将此映射传递给其他类作为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 beans map,还是有其他好的方法从数据库加载配置,并在其他应用程序中引用它,如service,delegate和DAO?

帮助将不胜感激

由于

3 个答案:

答案 0 :(得分:3)

你应该使用spring 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>

答案 1 :(得分:1)

FactoryBean answer是正确的,但是it's the old way of doing things

相反,请使用@Configuration

@Configuration
public class DBConfiguration{

    @Autowired
    private DataSource dataSource;

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

}

此方法的众多优点之一是您可以将DataSource自动装配到配置类中。

顺便说一句,使用地图作为bean感觉不对。我会在地图周围创建一个包装器对象并将其用作Spring Bean,但意见不同。

答案 2 :(得分:0)

我今天真正发现的是,当你需要将bean名称映射到特定接口的实例时,不需要@Qualifier和任何类型的FactoryBean代码。 Spring会为你找到并注入候选人。一点点魔力,但似乎是这样的。