2011-01-04 2 views
17

내 프로젝트에서는 표준 Java .properties 파일로 수행하기 쉬운 Spring 관리 빈의 특성을 외부화하고 싶다. 지도처럼 작동하는 DB 테이블에서 해당 속성을 읽을 수 있기를 원합니다 (키는 속성 이름이고, 값은 속성에 할당 된 값입니다).데이터베이스 테이블에 저장된 속성으로 Spring 빈을 구성하는 방법

의 사용을 제안하는 this post이 발견되었지만 Spring 3.x와 동일한 작업을 수행하는 더 좋은 방법이 있는지 모르겠습니다. 어쩌면 내 자신의 PropertyResource 또는 뭔가를 구현할 수 있습니다.

실마리가 있습니까?

답변

22

을 사용하여 구현하려는 <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을 확장 할 수 있습니다. 두 개의 현재 구현 (PreferencesXServletContextX)을보고 jdbc 기반으로 직접 롤아웃하십시오.

0

프로그래밍 방식으로 "PropertyPlaceholderConfigurer"를 만드는 방법은 아래를 참조하십시오.

속성을 읽는 DAO를 작성하고 아래와 같이 PropertyPlaceholderConfigurer를 작성하십시오.

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