programing

스프링 구성 파일을 사용하여 시스템 속성 설정

jooyons 2023. 8. 23. 21:46
반응형

스프링 구성 파일을 사용하여 시스템 속성 설정

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

${log.location}

런타임에 시스템 속성이 -D java 옵션으로 설정됩니다.잘 있다.

문제 / 필요한 사항:
장치 테스트 시간에 시스템 속성이 설정되지 않았으며 파일 위치가 확인되지 않았습니다.
앱에서 Spring을 사용하여 시스템 속성을 설정하도록 Spring을 구성하려고 합니다.

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

이 아이디어는 비슷하지만 Java 코드를 추가해야 합니다.
스프링 시스템 특성빈 초기화 중

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

이를 위한 방법에 대한 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>

가지 방법을 조합하여 이를 달성할 수 있습니다.공장 콩 호출

System.getProperties에 액세스하는 내부 빈과 내부 빈에서 획득한 속성에 대해 putAll을 호출하는 외부 빈을 만듭니다.

<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>

(물론 한 개의 빈과 대상 시스템만 사용할 수 있습니다.속성()을 설정하지만 기존 속성을 대체하는 것은 좋지 않습니다.

어쨌든, 제 작은 테스트 방법은 다음과 같습니다.

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 Batch에 시스템 속성이 있음시스템 속성을 조금 더 간결하게 설정하는 데 사용할 수 있는 이니셜라이저 클래스. 예를 들어 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" 특성을 추가해야 합니다.

좀 더 간결한 접근법은 다음과 같습니다.

<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

반응형