4

现在我已经在 spring bean 映射中应用了相关的数据,并将这个映射作为参考传递给其他类。

地图定义如下

<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还是有任何其他好的方法来从数据库加载配置并将其引用到服务、委托和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
    }

}

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

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

于 2013-02-04T16:49:07.580 回答
0

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

于 2014-10-06T13:07:48.010 回答