복붙노트

[SPRING] 데이터베이스 테이블에 저장된 프로퍼티로 Spring 빈을 설정하는 법

SPRING

데이터베이스 테이블에 저장된 프로퍼티로 Spring 빈을 설정하는 법

우리 프로젝트에서는 표준 Java .properties 파일로 매우 쉽게 할 수있는 Spring 관리 Bean의 속성을 외부화하고 싶습니다. 그러나 Map (와 같은 동작을하는 DB 테이블에서 해당 속성을 읽을 수 있기를 원합니다. key는 속성 이름이고, value는 해당 속성에 할당 된 값입니다.

Commons Configuration의 사용법을 제안하는이 게시물을 발견했지만 스프링 3.x와 동일한 작업을 수행하는 더 좋은 방법이 있는지 모르겠습니다. 어쩌면 내 자신의 PropertyResource 또는 뭔가를 구현할 수 있습니다.

모든 단서?

해결법

  1. ==============================

    1.JdbcTemplate을 사용하여 구현하는 유형의 FactoryBean을 사용할 것입니다. 그런 다음 생성 된 Properties 객체를 메커니즘과 함께 사용할 수 있습니다.

    JdbcTemplate을 사용하여 구현하는 유형의 FactoryBean을 사용할 것입니다. 그런 다음 생성 된 Properties 객체를 메커니즘과 함께 사용할 수 있습니다.

    샘플 코드 :

    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" />
    
  2. ==============================

    2.Sean의 제안 외에도 PropertyPlaceholderConfigurer를 확장 할 수 있습니다. 두 개의 현재 구현 (PreferencesX 및 ServletContextX)을 살펴보고 jdbc 기반의 자신 만의 기능을 구현하십시오.

    Sean의 제안 외에도 PropertyPlaceholderConfigurer를 확장 할 수 있습니다. 두 개의 현재 구현 (PreferencesX 및 ServletContextX)을 살펴보고 jdbc 기반의 자신 만의 기능을 구현하십시오.

  3. ==============================

    3.프로그래밍 방식으로 "PropertyPlaceholderConfigurer"를 만드는 방법이 있습니다. 아래를 참조하십시오.

    프로그래밍 방식으로 "PropertyPlaceholderConfigurer"를 만드는 방법이 있습니다. 아래를 참조하십시오.

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

    XmlBeanFactory factory = new XmlBeanFactory(new FileSystemResource("beans.xml"));
    PropertyPlaceholderConfigurer cfg = new PropertyPlaceholderConfigurer();
    cfg.setProperties(yourProperties);
    cfg.postProcessBeanFactory(factory);
    
  4. from https://stackoverflow.com/questions/4599252/how-to-configure-a-spring-beans-with-properties-that-are-stored-in-a-database-ta by cc-by-sa and MIT license