Конфигурация:
Spring 2.5, Junit 4, Log4j
log4j расположение файла указано от системного свойства
${log.location}
Во времени выполнения, системном наборе свойств с-D опцией Java. Все хорошо.
Проблема / В чем я Нуждаюсь:
Во время модульного теста, системное свойство не набор и расположение файла, не разрешенное.
Spring использования приложения, хотел бы просто настроить Spring для установки системного свойства.
Подробнее:
Требование для конфигурации только. Не может представить новый код Java или записи в IDE. Идеально, одна из реализаций конфигурации свойства Spring могла обработать это - я просто не смог найти правильную комбинацию.
Эта идея близка, но должна добавить код Java:
Spring SystemPropertyInitializingBean
Какая-либо справка там? Любые идеи ценятся.
Вы можете достичь этого с помощью комбинации двух 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\