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

我发现有this post个建议使用Commons Configuration,但我不知道是否有更好的方法在Spring3.x中做到这一点.也许实现我自己的PropertyResource之类的.

有什么线索吗?

推荐答案

我会用<Properties>型的FactoryBean,我会用JdbcTemplate实现.然后可以将生成的Properties对象与<context:property-placeholder>机制一起使用.

Sample code:

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 Configuration:

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

Database相关问答推荐

触发器作为完整性的判断约束

如何替换对象数组内的数组元素

PostgreSQL 嵌套 INSERTs / WITHs 用于外键插入

创建数据库索引有哪些最佳实践和经验法则?

什么是非规范化 mysql 数据库的好方法?

Cassandra 还是 MySQL/PostgreSQL?

我应该为我创建的新创建的 PostgreSQL 模式使用什么正确的文件扩展名?

怎样有效存储 7.300.000.000 行?

MySQL 中的多个 OR 子句

触发器内的多个插入/更新语句?

与号 (&) 处的 XML 错误

免费的便携式数据库有哪些?

应用程序用户应该是数据库用户吗?

Redis: Get key and value on expiration

单父实体的核心数据性能

Redis-cli - Select 哪个实例?

C++ SQL 数据库库比较

显式事务回滚是否必要?

关系未更新的 NSFetchedResultsController

使用带有联合和 CLOB 字段的 Select 时出现错误 ORA-00932