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

时间:2011-01-04 22:48:05

标签: java database spring configuration properties

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

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

任何线索?

3 个答案:

答案 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。查看当前的两个实现 - PreferencesXServletContextX,并推出自己的基于jdbc的实现。

答案 2 :(得分:0)

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

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

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