program tip

Spring 구성 파일로 시스템 속성 설정

radiobox 2020. 12. 14. 08:01
반응형

Spring 구성 파일로 시스템 속성 설정


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

${log.location}

런타임시 -D java 옵션으로 설정된 시스템 속성. 모든 것이 좋습니다.

문제 / 필요한 사항 :
단위 테스트시 시스템 속성이 설정되지 않았고 파일 위치가 해결되지 않았습니다.
앱은 Spring을 사용 하고 시스템 속성 설정 하기 위해 Spring을 구성하고 싶습니다 .

추가 정보 :
요구 사항은 구성 전용입니다. 새 Java 코드 또는 항목을 IDE에 도입 할 수 없습니다. 이상적으로는 Spring의 속성 구성 구현 중 하나가이를 처리 할 수 ​​있습니다. 올바른 조합을 찾을 수 없었습니다.

이 아이디어는 비슷하지만 Java 코드를 추가해야합니다.
Spring SystemPropertyInitializingBean

도움이 필요하십니까? 어떤 아이디어라도 감사합니다.


두 개의 MethodInvokingFactoryBeans 의 조합으로이를 달성 할 수 있습니다.

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>

(물론 하나의 빈과 대상 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\

이를 수행하는 방법에 대한 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>

Spring Batch has a SystemPropertyInitializer class which can be used to set a system property slightly more concisely, e.g. to force JBoss logging to use slf4j (with 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"

Remember to add the "depends-on" attribute to force the system property to be set first.


For a more terse approach try:

<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'}}"/>

참고URL : https://stackoverflow.com/questions/3339736/set-system-property-with-spring-configuration-file

반응형