2011-01-04 16 views
17

私のプロジェクトでは、SpringのマネージドBeanのプロパティを外部化したいのですが、標準のJava .propertiesファイルでは非常に簡単ですMap(キーはプロパティ名、valueはそのプロパティに割り当てられた値)のように動作するDBテーブルからそれらのプロパティを読み取ることができるようにします。データベーステーブルに格納されているプロパティでSpring Beanを設定する方法

の使用を示唆しているthis postが見つかりましたが、Spring 3.xで同じことをするより良い方法があるかどうかわかりません。私自身のPropertyResourceなどを実装しているかもしれません。

手がかりはありますか?

答えて

22

JdbcTemplateを使用して実装する<Properties>FactoryBeanを使用します。生成された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" /> 
1

ショーンの提案に加えて、あなたはPropertyPlaceholderConfigurerを拡張することができます。現在の2つの実装 - PreferencesXServletContextXを見て、独自のjdbcベースのものを公開してください。

0

"PropertyPlaceholderConfigurer"をプログラムで作成する方法があります。以下を参照してください。

プロパティを読み取るDAOを作成し、以下に示すようにPropertyPlaceholderConfigurerを作成します。

XmlBeanFactory factory = new XmlBeanFactory(new FileSystemResource("beans.xml")); 
PropertyPlaceholderConfigurer cfg = new PropertyPlaceholderConfigurer(); 
cfg.setProperties(yourProperties); 
cfg.postProcessBeanFactory(factory); 
関連する問題