Как настроить bean-компоненты Spring со свойствами, которые хранятся в таблице базы данных - PullRequest
19 голосов
/ 05 января 2011

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

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

Есть какие-нибудь подсказки?

Ответы [ 3 ]

22 голосов
/ 05 января 2011

Я бы использовал FactoryBean типа <Properties>, который я бы реализовал, используя JdbcTemplate.Затем вы можете использовать сгенерированный объект Properties с механизмом In Spring Reference"><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" />
1 голос
/ 05 января 2011

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

0 голосов
/ 01 июля 2012

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

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

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