如何从Main类将属性注入spring bean

时间:2011-07-25 18:38:05

标签: java spring

我正在使用带有我的应用程序的spring,并且我能够将类路径上的某些文件中的一些属性注入到我的应用程序中,一切都运行良好。即

<bean class="org.springframework.web.context.support.ServletContextPropertyPlaceholderConfigurer">
        <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
        <property name="searchContextAttributes" value="true" />
        <property name="contextOverride" value="true" />
        <property name="ignoreResourceNotFound" value="true" />
        <property name="locations">
            <list>
                <value>classpath:application.properties</value>
            </list>
        </property>
    </bean>

现在我可以在我的春天语境中使用${any.property.from.application.properties}。在我的主要班级:

ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("appContext.xml");

它也有效,我的问题是如何在弹簧上下文中注入属性文件位置而不是它最初存在,我想让我的应用程序可配置。如果我正在从C:\dir/user/home/dir执行我的应用,我认为在应用程序上下文中,值应为C:\application.properties/user/home/dir/application.properties

3 个答案:

答案 0 :(得分:2)

我有时会遇到类似的问题。我的要求是属性文件没有捆绑在应用程序内(因此不在类路径中)。该文件可以位于文件系统中的任何位置。  这是我解决它的方式,

  1. 定义一个环境变量,其值指向application.properties的位置。
  2. 假设我们有一个env变量APP_PROP_HOME,其值为/ user / home / dir /
  3. 现在在定义ServletContextPropertyPlaceholderConfigurer时,按如下方式定义位置
  4. 我正在重复你的例子

    <bean class="org.springframework.web.context.support.ServletContextPropertyPlaceholderConfigurer">
            <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
            <property name="searchContextAttributes" value="true" />
            <property name="contextOverride" value="true" />
            <property name="ignoreResourceNotFound" value="true" />
            <property name="locations">
                <list>
                    <value>file://${APP_PROP_HOME}/application.properties</value>
                </list>
            </property>
        </bean>
    

    Spring将$ {APP_PROP_HOME}解析为存储在相应env属性中的值,并在运行时配置应用程序。

答案 1 :(得分:0)

如果我正确地阅读了您的问题,您想使用外部属性文件(即文件不在应用程序运行时类路径中)。如果是这种情况,则需要使用文件标签

 <value>file:///c:\application.properties</value>

答案 2 :(得分:0)

您可以使用@Value从env中注入值。例如:

private someFoo;

@Value("${systemProperties.someFoo}")
public void setSomeParam(String someParam) {
   this.someFoo = someParam;
}