2011-01-04 11 views
17

Nel mio progetto vorremmo esternalizzare le proprietà dei nostri bean gestiti Spring, che è molto facile da fare con i file Java .properties standard, tuttavia noi desidera essere in grado di leggere tali proprietà da una tabella DB che si comporta come una mappa (la chiave è il nome della proprietà, il valore è il valore assegnato a tale proprietà).Come configurare un bean Spring con proprietà che sono memorizzate in una tabella di database

Ho trovato this post che suggeriscono l'utilizzo di Commons Configuration ma non so se c'è un modo migliore per fare lo stesso con Spring 3.x. Forse implementando il mio PropertyResource o qualcosa del genere.

Eventuali indizi?

risposta

22

Vorrei utilizzare uno FactoryBean di tipo <Properties> che implementerei utilizzando JdbcTemplate. È quindi possibile utilizzare l'oggetto Properties generato con il meccanismo <context:property-placeholder>.

codice di esempio: Configurazione

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

Oltre al suggerimento di Sean, è possibile estendere PropertyPlaceholderConfigurer. Guarda le due implementazioni correnti - PreferencesX e ServletContextX, e stendi il tuo, basato su jdbc.

0

Ci sono modi per creare "PropertyPlaceholderConfigurer" a livello di programmazione, vedere sotto.

Scrivere un DAO che legge Proprietà e crea un PropertyPlaceholderConfigurer come mostrato di seguito.

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