如何使用存储在数据库表中的属性配置 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。查看当前的两个实现 - PreferencesXServletContextX,并推出您自己的基于 jdbc 的实现。

【讨论】:

以上是关于如何使用存储在数据库表中的属性配置 Spring bean的主要内容,如果未能解决你的问题,请参考以下文章

Spring Cloud 配置服务器未读取本地 git 存储库中的属性文件

如何跨模式和数据库对存储在表中的数据提供数据隔离/受控访问

spring boot 中如何根据id查询数据库表

Spring:如何从联结表中删除条目?

如何使用spring boot将数据从一个html表单传递到多个表

问题回答