Системное свойство набора с конфигурационным файлом Spring

Конфигурация:
Spring 2.5, Junit 4, Log4j
log4j расположение файла указано от системного свойства

${log.location}

Во времени выполнения, системном наборе свойств с-D опцией Java. Все хорошо.

Проблема / В чем я Нуждаюсь:
Во время модульного теста, системное свойство не набор и расположение файла, не разрешенное.
Spring использования приложения, хотел бы просто настроить Spring для установки системного свойства.

Подробнее:
Требование для конфигурации только. Не может представить новый код Java или записи в IDE. Идеально, одна из реализаций конфигурации свойства Spring могла обработать это - я просто не смог найти правильную комбинацию.

Эта идея близка, но должна добавить код Java:
Spring SystemPropertyInitializingBean

Какая-либо справка там? Любые идеи ценятся.

57
задан n00begon 16 August 2012 в 03:03
поделиться

1 ответ

Вы можете достичь этого с помощью комбинации двух MethodInvokingFactoryBeans

Создайте внутренний боб, который обращается к 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>

(Вы, конечно, могли бы использовать только один боб и нацелиться на 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\
55
ответ дан 24 November 2019 в 19:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: