如何使用存储在数据库表中的属性配置Spring bean

在我的项目中,我们想要外化Spring托管bean的属性,这对于标准的Java .properties文件非常容易,但是我们希望能够从行为类似于Map的DB表中读取这些属性( key是属性名称,value是分配给该属性的值)。

我发现这篇文章建议使用Commons Configuration但我不知道是否有更好的方法来对Spring 3.x做同样的事情。 也许实现我自己的PropertyResource或其他东西。

有什么线索吗?

我将使用我使用JdbcTemplate实现的类型的FactoryBean 。 然后,您可以将生成的Properties对象与机制一起使用。

示例代码:

 public class JdbcPropertiesFactoryBean extends AbstractFactoryBean{ @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配置:

             

除了Sean的建议,您还可以扩展PropertyPlaceholderConfigurer 。 看看当前的两个实现 – PreferencesXServletContextX ,并推出自己的基于jdbc的实现。

有一些方法可以通过编程方式创建“PropertyPlaceholderConfigurer”,请参阅下文。

编写一个读取属性的DAO并创建一个PropertyPlaceholderConfigurer,如下所示。

 XmlBeanFactory factory = new XmlBeanFactory(new FileSystemResource("beans.xml")); PropertyPlaceholderConfigurer cfg = new PropertyPlaceholderConfigurer(); cfg.setProperties(yourProperties); cfg.postProcessBeanFactory(factory);