2011-01-04 7 views
17

En mi proyecto nos gustaría externalizar las propiedades de nuestros beans gestionados de Spring, que es muy fácil de hacer con los archivos .properties de Java estándar, sin embargo desea poder leer esas propiedades desde una tabla DB que se comporta como un Mapa (la clave es el nombre de la propiedad, el valor es el valor asignado a esa propiedad).Cómo configurar un frijol de primavera con propiedades que están almacenadas en una tabla de base de datos

Encontré this post que sugieren el uso de Commons Configuration 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?

Respuesta

22

Utilizaría un FactoryBean del tipo <Properties> que implementaría usando JdbcTemplate. A continuación, puede utilizar el objeto generado Properties con el mecanismo <context:property-placeholder>.

Código de ejemplo: Configuración

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

Además de la sugerencia de Sean, que se puede extender PropertyPlaceholderConfigurer. Mire las dos implementaciones actuales: PreferencesX y ServletContextX, y despliegue su propia base jdbc.

0

Existen formas de crear "PropertyPlaceholderConfigurer" Programmatically, consulte más abajo.

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); 
Cuestiones relacionadas