복붙노트

[SPRING] 스프링 설정 파일로 시스템 속성 설정

SPRING

스프링 설정 파일로 시스템 속성 설정

구성 : Spring 2.5, Junit 4, Log4j log4j 파일 위치는 시스템 등록 정보에서 지정됩니다.

${log.location}

런타임시 시스템 등록 정보는 -D java 옵션으로 설정됩니다. 모든 것이 잘됩니다.

문제 / 필요한 것 : 단위 테스트 시간에는 시스템 속성이 설정되지 않고 파일 위치가 확인되지 않습니다. App은 Spring을 사용하며 단순히 시스템 속성을 설정하기 위해 Spring을 구성하려고합니다.

더 많은 정보: 요구 사항은 구성 전용입니다. 새 Java 코드 또는 항목을 IDE에 도입 할 수 없습니다. 이상적으로, Spring의 프로퍼티 설정 구현 중 하나가 이것을 처리 할 수있다. 나는 적절한 조합을 찾을 수 없었다.

이 개념은 비슷하지만 Java 코드를 추가해야합니다. Spring SystemPropertyInitializingBean

밖에 도움이 필요 하신가요? 어떤 아이디어라도 감사합니다.

해결법

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

    1.당신은 두 개의 MethodInvokingFactoryBean의 조합으로이를 달성 할 수 있습니다.

    당신은 두 개의 MethodInvokingFactoryBean의 조합으로이를 달성 할 수 있습니다.

    System.getProperties에 액세스하는 내부 bean을 작성하고 내부 bean에 의해 획득 된 등록 정보에 대해 putAll을 호출하는 외부 bean을 작성하십시오.

    <bean
        class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
        <property
            name="targetObject">
            <!-- System.getProperties() -->
            <bean
                class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
                <property name="targetClass" value="java.lang.System" />
                <property name="targetMethod" value="getProperties" />
            </bean>
        </property>
        <property
            name="targetMethod"
            value="putAll" />
        <property
            name="arguments">
            <!-- The new Properties -->
            <util:properties>
                <prop
                    key="my.key">myvalue</prop>
                <prop
                    key="my.key2">myvalue2</prop>
                <prop
                    key="my.key3">myvalue3</prop>
    
            </util:properties>
        </property>
    </bean>
    

    물론 하나의 bean을 사용하고 System.setProperties ()를 대상으로 할 수는 있지만 기존 속성을 바꾸는 것이 좋지는 않습니다.

    어쨌든, 여기 내 작은 테스트 방법 :

    public static void main(final String[] args) {
    
        new ClassPathXmlApplicationContext("classpath:beans.xml");
    
        System.out.println("my.key: "+System.getProperty("my.key"));
        System.out.println("my.key2: "+System.getProperty("my.key2"));
        System.out.println("my.key3: "+System.getProperty("my.key3"));
    
        // to test that we're not overwriting existing properties
        System.out.println("java.io.tmpdir: "+System.getProperty("java.io.tmpdir"));
    }
    

    출력은 다음과 같습니다.

    my.key: myvalue
    my.key2: myvalue2
    my.key3: myvalue3
    java.io.tmpdir: C:\DOKUME~1\SEANFL~1\LOKALE~1\Temp\
    
  2. ==============================

    2.댓글에서 Spring 3 예제를위한 요청이있었습니다.

    댓글에서 Spring 3 예제를위한 요청이있었습니다.

    <bean id="systemPrereqs"
        class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
        <property name="targetObject" value="#{@systemProperties}" />
        <property name="targetMethod" value="putAll" />
        <property name="arguments">
            <!-- The new Properties -->
            <util:properties>
                <prop key="java.security.auth.login.config">/super/secret/jaas.conf</prop>
            </util:properties>
        </property>
    </bean>
    
  3. ==============================

    3.Spring Batch는 SystemPropertyInitializer 클래스를 가지고 있습니다.이 클래스는 시스템 속성을 약간 더 간결하게 설정하는 데 사용할 수 있습니다. JBoss 로깅을 강제로 slf4j (Spring JPA 사용) :

    Spring Batch는 SystemPropertyInitializer 클래스를 가지고 있습니다.이 클래스는 시스템 속성을 약간 더 간결하게 설정하는 데 사용할 수 있습니다. JBoss 로깅을 강제로 slf4j (Spring JPA 사용) :

    <bean id="setupJBossLoggingProperty"
        class="org.springframework.batch.support.SystemPropertyInitializer"
        p:keyName="org.jboss.logging.provider" p:defaultValue="slf4j"/>
    
    <bean id="entityManagerFactory"
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
        depends-on="setupJBossLoggingProperty"
    

    "depends-on"속성을 추가하여 시스템 속성을 먼저 설정하도록하십시오.

  4. ==============================

    4.좀 더 간결한 방법을 시도해보십시오.

    좀 더 간결한 방법을 시도해보십시오.

    <beans ... xmlns:p="http://www.springframework.org/schema/p" ...    
        <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean" 
            p:targetObject="#{@systemProperties}" p:targetMethod="setProperty"
            p:arguments="#{{'org.jboss.logging.provider','slf4j'}}"/>
    
  5. from https://stackoverflow.com/questions/3339736/set-system-property-with-spring-configuration-file by cc-by-sa and MIT license