在我的项目中,我们希望将Spring托管bean的属性外部化,这在标准Java中非常容易做到.属性文件,但是我们希望能够从行为类似于映射的DB表中读取这些属性(键是属性名称,值是分配给该属性的值).
我发现有this post个建议使用Commons Configuration,但我不知道是否有更好的方法在Spring3.x中做到这一点.也许实现我自己的PropertyResource之类的.
有什么线索吗?
在我的项目中,我们希望将Spring托管bean的属性外部化,这在标准Java中非常容易做到.属性文件,但是我们希望能够从行为类似于映射的DB表中读取这些属性(键是属性名称,值是分配给该属性的值).
我发现有this post个建议使用Commons Configuration,但我不知道是否有更好的方法在Spring3.x中做到这一点.也许实现我自己的PropertyResource之类的.
有什么线索吗?
我会用<Properties>
型的FactoryBean
,我会用JdbcTemplate
实现.然后可以将生成的Properties
对象与<context:property-placeholder>
机制一起使用.
Sample code:个
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 Configuration:个
<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" />