복붙노트

[SPRING] 스프링을 사용하여 동적으로 특성 파일로드

SPRING

스프링을 사용하여 동적으로 특성 파일로드

나는 PropertyUtils 클래스 (인터넷에서)를 작성했다.이 클래스는 속성을로드 할 것이다.

<bean id="propertiesUtil" class="com.myApp.PropertiesUtil" >
    <property name="locations">
        <list>
            <value>classpath:myApp/myApp.properties</value>         
        </list>
    </property>
</bean>

PropertiesUtil 클래스는 아래와 같습니다.

public class PropertiesUtil extends PropertyPlaceholderConfigurer {

    private static Map<String, String> properties = new HashMap<String, String>();

    @Override
    protected void loadProperties(final Properties props) throws IOException {
        super.loadProperties(props);
        for (final Object key : props.keySet()) {
            properties.put((String) key, props.getProperty((String) key));
        }
    }

    public String getProperty(final String name) {
        return properties.get(name);
    }

}

나중에 PropertiesUtil.getProperty () 메서드를 호출하여 속성을 가져올 수 있습니다.

하지만 이제 약간 수정하여 myApp.properties가 사용자에 의해 수정되거나 변경된 경우 다시로드해야합니다.

아마 FileWatcher 클래스가 필요합니다.

public abstract class FileWatcher extends TimerTask {
    private long timeStamp;
    private File file;

    public FileWatcher(File file) {
        this.file = file;
        this.timeStamp = file.lastModified();
    }

    @Override
    public final void run() {
        long timeStampNew = this.file.lastModified();

        if (this.timeStamp != timeStampNew) {
            this.timeStamp = timeStampNew;
            onChange(this.file);
        }
    }

    protected abstract void onChange(File newFile);
}

하지만 내 의심은

해결법

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

    1.다음과 같이 Spring의 ReloadableResourceBundleMessageSource 클래스를 사용할 수 있습니다.

    다음과 같이 Spring의 ReloadableResourceBundleMessageSource 클래스를 사용할 수 있습니다.

    <?xml version="1.0" encoding="UTF-8" ?>
    <beans xmlns="http://www.springframework.org/schema/beans" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
    
        <bean id="myProperties" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
            <!-- check property file(s) every 1 second -->
            <property name="cacheSeconds" value="1"/>
            <property name="basenames">
                <list>
                    <value>myApp/myApp</value>
                </list>
            </property>
        </bean>
    
    </beans>
    

    그런 다음 MessageSource.getMessage () 메서드를 호출하여 속성 값을 가져올 수 있습니다. 다음은 그 예입니다.

    package com.example;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.MessageSource;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class MyApp {
    public static void main(String[] args) throws InterruptedException {
            ApplicationContext ctx = new ClassPathXmlApplicationContext("myApp/MyApp.xml");
            MessageSource myProperties = (MessageSource) ctx.getBean("myProperties");
            while (true) {
                System.out.println(myProperties.getMessage("myApp.propertyOne", null, null));
                Thread.sleep(1000);
            }
        }
    } 
    

    'myProperties'bean의 이름을 'messageSource'로 변경하면 ApplicationContext.getMessage (String code, Object [] args, Locale locale)를 직접 호출 할 수 있습니다.

    웹 응용 프로그램의 경우 속성 파일을 웹 응용 프로그램의 클래스 경로 외부에 배치하십시오 (웹 서버가 캐시 할 수 있기 때문에). 예를 들어, WEB-INF / conf / myApp.properties

  2. ==============================

    2.다음은 당신이 찾고있는 것을 지원합니다 :

    다음은 당신이 찾고있는 것을 지원합니다 :

    https://commons.apache.org/proper/commons-configuration/userguide/howto_properties.html

    PropertiesConfiguration config = new PropertiesConfiguration("usergui.properties");
    config.setReloadingStrategy(new FileChangedReloadingStrategy());
    

    이것은 트릭을해야합니다. 나는 그것을 직접 사용하지 않았지만 꽤 직설적 인 것처럼 보인다.

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

    3.다음과 같이하는 것이 더 간단한 방법 일 수 있습니다.

    다음과 같이하는 것이 더 간단한 방법 일 수 있습니다.

    <util:properties location="classpath:config.properties" id="configProperties" />
    <context:property-placeholder properties-ref="configProperties"  />
    

    이렇게하면 bean을 "configProperties"라는 이름으로 주입 / 액세스하여 모든 bean에서 등록 정보에 액세스 할 수 있습니다. 런타임에 configProperties를 수정할 수 없으므로 이것이 필요한지 확실하지 않습니다. 그러나 이것은 깨끗한 방법이며 추가 클래스를 작성할 필요가 없습니다.

  4. from https://stackoverflow.com/questions/14117117/dynamically-loading-properties-file-using-spring by cc-by-sa and MIT license