使用弹簧配置文件设置系统属性

2022-08-31 16:47:05

配置
Spring 2.5、Junit 4、Log4j
log4j 从系统属性指定 log4j 文件位置

${log.location}

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

问题/我需要什么:
在单元测试时,未设置系统属性,并且未解决文件位置。
App使用Spring,只想简单地配置Spring来设置系统属性。

详细信息:
要求仅用于配置。无法在 IDE 中引入新的 Java 代码或条目。理想情况下,Spring的一个属性配置实现可以处理这个问题 - 我只是无法找到正确的组合。

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

有什么帮助吗?任何想法都是值得赞赏的。


答案 1

评论中有一个关于如何做到这一点的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>

答案 2

您可以通过两个方法调用FactoryBeans的组合来实现这一点。

创建一个访问 System.getProperties 的内部 Bean 和一个调用 putAll 的外部 Bean 对内部 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(),但这样你就会替换现有的属性,这不是一个好主意。

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

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\

推荐