使用Springconfiguration文件设置系统属性

configuration
Spring 2.5,Junit 4,Log4j
log4j文件位置是从系统属性指定的

${log.location} 

在运行时,使用-D java选项设置系统属性。 一切都很好。

问题/我需要什么:
在unit testing时间,系统属性未设置,文件位置未解决。
应用程序使用Spring,想简单地configurationSpring来设置系统属性。

更多信息:
要求仅用于configuration。 无法引入新的Java代码或条目到IDE中。 理想情况下,Spring的属性configuration实现可以处理这一点 – 我只是无法find正确的组合。

这个想法很接近,但需要添加Java代码:
Spring的SystemPropertyInitializingBean

有什么帮助吗? 任何想法都表示赞赏。

您可以通过两个MethodInvokingFactoryBeans的组合来实现

创build一个访问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(),但是你会replace现有的属性,这不是一个好主意。

无论如何,这是我的小testing方法:

 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有一个SystemPropertyInitializer类,可以用来更简洁地设置一个系统属性,例如,强制JBoss日志logging使用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'}}"/>