如何使用存储在数据库表中的属性配置 Spring bean
Posted
技术标签:
【中文标题】如何使用存储在数据库表中的属性配置 Spring bean【英文标题】:How to configure a Spring beans with properties that are stored in a database table 【发布时间】:2011-06-03 17:03:13 【问题描述】:在我的项目中,我们希望将 Spring 托管 bean 的属性外部化,这对于标准 Java .properties 文件很容易做到,但是我们希望能够从行为类似的 DB 表中读取这些属性一个 Map(键是属性名称,值是分配给该属性的值)。
我发现this post 建议使用Commons Configuration,但我不知道是否有更好的方法来使用Spring 3.x。也许实现我自己的 PropertyResource 或其他东西。
有什么线索吗?
【问题讨论】:
【参考方案1】:有多种方法可以通过编程方式创建“PropertyPlaceholderConfigurer”,请参见下文。
编写一个读取属性的 DAO 并创建一个 PropertyPlaceholderConfigurer,如下所示。
XmlBeanFactory factory = new XmlBeanFactory(new FileSystemResource("beans.xml"));
PropertyPlaceholderConfigurer cfg = new PropertyPlaceholderConfigurer();
cfg.setProperties(yourProperties);
cfg.postProcessBeanFactory(factory);
【讨论】:
【参考方案2】:我将使用<Properties>
类型的FactoryBean
,我将使用JdbcTemplate
实现它。然后,您可以将生成的Properties
对象与<context:property-placeholder>
机制一起使用。
示例代码:
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" />
【讨论】:
【参考方案3】:除了肖恩的建议,你还可以扩展PropertyPlaceholderConfigurer
。查看当前的两个实现 - PreferencesX
和 ServletContextX
,并推出您自己的基于 jdbc 的实现。
【讨论】:
以上是关于如何使用存储在数据库表中的属性配置 Spring bean的主要内容,如果未能解决你的问题,请参考以下文章
Spring Cloud 配置服务器未读取本地 git 存储库中的属性文件