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

Eli*_*oto 19 java database configuration spring properties

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

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

有线索吗?

Sea*_*oyd 22

我使用的是我实现FactoryBean的类型.然后,您可以将生成的对象与机制一起使用.<Properties>JdbcTemplateProperties<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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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" />
Run Code Online (Sandbox Code Playgroud)