现在我在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?
帮助将不胜感激
由于
答案 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
自动装配到配置类中。
答案 2 :(得分:0)
我今天真正发现的是,当你需要将bean名称映射到特定接口的实例时,不需要@Qualifier
和任何类型的FactoryBean
代码。 Spring会为你找到并注入候选人。一点点魔力,但似乎是这样的。