java database spring configuration properties

java - Cómo configurar un Spring beans con propiedades almacenadas en una tabla de base de datos



database configuration (3)

Además de la sugerencia de Sean, puede extender PropertyPlaceholderConfigurer . Mire las dos implementaciones actuales, PreferencesX y ServletContextX , y desarrolle las suyas propias, basadas en jdbc.

En mi proyecto nos gustaría externalizar las propiedades de nuestros beans administrados por Spring, que es muy fácil de hacer con los archivos .properties estándar de Java, sin embargo, queremos poder leer esas propiedades desde una tabla de base de datos que se comporta como un mapa ( clave es el nombre de la propiedad, valor es el valor asignado a esa propiedad).

Encontré esta publicación que sugiere el uso de la Configuración de Commons, pero no sé si hay una mejor manera de hacer lo mismo con Spring 3.x. Tal vez implementando mi propio PropertyResource o algo así.

¿Alguna pista?


Hay formas de crear "PropertyPlaceholderConfigurer" mediante programación, consulte a continuación.

Escriba un DAO que lea Propiedades y cree un PropertyPlaceholderConfigurer como se muestra a continuación.

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


FactoryBean un FactoryBean de tipo <Properties> que implementaría usando JdbcTemplate . Luego puede usar el objeto Properties generado con el mecanismo <context:property-placeholder> .

Código de muestra:

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; } }

Configuración 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" />