在我的项目中,我们想要外化我们的Spring托管bean的属性,这对于标准的Java .properties文件非常容易,但是我们希望能够从DB表中读取这些属性,一个Map(key是属性名称,value是分配给该属性的值)。
我发现this post建议使用Commons Configuration,但我不知道是否有更好的方法来对Spring 3.x做同样的事情。也许实现我自己的PropertyResource或其他东西。
任何线索?
答案 0 :(得分:22)
我使用FactoryBean
JdbcTemplate
类型<Properties>
,我使用Properties
实现。然后,您可以将生成的<context:property-placeholder>
对象与{{3}}机制一起使用。
示例代码:
public class JdbcPropertiesFactoryBean
extends AbstractFactoryBean<Properties>{
@Required
public void setJdbcTemplate(final JdbcTemplate jdbcTemplate){
this.jdbcTemplate = jdbcTemplate;
}
private JdbcTemplate jdbcTemplate;
@Required
public void setTableName(final String tableName){
this.tableName = tableName;
}
private String tableName;
@Required
public void setKeyColumn(final String keyColumn){
this.keyColumn = keyColumn;
}
private String keyColumn;
@Required
public void setValueColumn(final String valueColumn){
this.valueColumn = valueColumn;
}
private String valueColumn;
@Override
public Class<?> getObjectType(){
return Properties.class;
}
@Override
protected Properties createInstance() throws Exception{
final Properties props = new Properties();
jdbcTemplate.query("Select " + keyColumn + ", " + valueColumn
+ " from " + tableName, new RowCallbackHandler(){
@Override
public void processRow(final ResultSet rs) throws SQLException{
props.put(rs.getString(1), rs.getString(2));
}
});
return props;
}
}
XML配置:
<bean id="props" class="foo.bar.JdbcPropertiesFactoryBean">
<property name="jdbcTemplate">
<bean class="org.springframework.jdbc.core.JdbcTemplate">
<!-- reference to a defined data source -->
<constructor-arg ref="dataSource" />
</bean>
</property>
<property name="tableName" value="TBL_PROPERTIES" />
<property name="keyColumn" value="COL_KEY" />
<property name="valueColumn" value="COL_VAL" />
</bean>
<context:property-placeholder properties-ref="props" />
答案 1 :(得分:1)
除了肖恩的建议,你可以扩展PropertyPlaceholderConfigurer
。查看当前的两个实现 - PreferencesX
和ServletContextX
,并推出自己的基于jdbc的实现。
答案 2 :(得分:0)
有一些方法可以通过编程方式创建“PropertyPlaceholderConfigurer”,请参阅下文。
编写一个读取属性的DAO并创建一个PropertyPlaceholderConfigurer,如下所示。
XmlBeanFactory factory = new XmlBeanFactory(new FileSystemResource("beans.xml"));
PropertyPlaceholderConfigurer cfg = new PropertyPlaceholderConfigurer();
cfg.setProperties(yourProperties);
cfg.postProcessBeanFactory(factory);