Подтвердить что ты не робот

Как настроить Spring beans со свойствами, которые хранятся в таблице базы данных

В моем проекте мы хотим экпортировать свойства нашего Spring управляемого beans, что очень легко сделать со стандартными файлами Java.properties, однако мы хотим иметь возможность читать эти свойства из БД таблица, которая ведет себя как карта (ключ - это имя свойства, значение - это значение, присвоенное этому свойству).

Я нашел этот пост, который предлагает использовать Commons Configuration но я не знаю, есть ли лучший способ сделать то же самое с Spring 3.x. Возможно, реализация моего собственного PropertyResource или что-то в этом роде.

Любые подсказки?

4b9b3361

Ответ 1

Я бы использовал FactoryBean типа <Properties>, который я бы выполнил используя 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" />

Ответ 2

В дополнение к предложению Шона вы можете расширить PropertyPlaceholderConfigurer. Посмотрите на две текущие реализации - PreferencesX и ServletContextX, и разверните свой собственный, основанный на jdbc.

Ответ 3

Существуют способы создания "PropertyPlaceholderConfigurer" программно, пожалуйста, см. ниже.

Напишите DAO, который читает "Свойства" и создает PropertyPlaceholderConfigurer, как показано ниже.

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