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

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

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

有什么线索吗?


答案 1

我会使用一个 FactoryBean 类型,我会使用 JdbcTemplate 实现它。然后,可以将生成的属性对象与<上下文:属性占位符>机制一起使用。<Properties>

示例代码:

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" />

答案 2

除了肖恩的建议,你还可以扩展.看看当前的两个实现 - 和 ,并推出你自己的,基于jdbc的实现。PropertyPlaceholderConfigurerPreferencesXServletContextX