有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

bean的类属性中的java属性占位符

我和我的一位同事正在使用以下spring配置:

<beans>
   <context:property-placeholder location='classpath:/configuration.properties'/>
    <bean id="myBean" class="${type}" />
</beans>

我们希望能够提供myBean的特定于环境的实现。在开发人员系统上type的值将是myBean的轻量级实现。在生产环境中,我们将使用完整的版本

当我的同事运行代码时,一切正常。当我运行代码时,我得到一个ClassNotFoundException,因为spring试图实例化${type}.class。这并不是说它有时有效,有时无效。在我的机器上它总是失败,在我的同事的机器上它总是工作

有人知道问题出在哪里吗

Thx提前, 叶甫盖尼

更新

根据要求,以下是我们加载应用程序上下文的方式:

ClassPathXmlApplicationContext("application-configuration.xml");

属性文件的内容非常简单:

type=foobar.TestServiceImpl

共 (3) 个答案

  1. # 1 楼答案

    以下假设为Spring 3.1+

    我可以肯定地告诉你这一点。让Spring在类中使用ClassNotFoundException失败

    ${type}
    

    表示它没有解析占位符

    当您指定

    <context:property-placeholder location='classpath:/configuration.properties'/>
    

    Spring使用PropertyPlaceholderBeanDefinitionParser来注册PropertySourcesPlaceholderConfigurerPropertyPlaceholderConfigurerbean,这将执行占位符解析

    PropertySourcesPlaceholderConfigurer是一个BeanFactoryPostProcessor。这意味着它可以修改bean定义。如果无法解析占位符,则进程将失败,并显示一个IllegalArgumentException,表明无法解析占位符

    如果您是说${type}没有被解析,那么就没有创建PropertySourcesPlaceholderConfigurerPropertyPlaceholderConfigurerbean。这可能意味着您的上下文没有

    <context:property-placeholder location='classpath:/configuration.properties'/>
    

    根据你向我们展示的信息,我认为这就是正在发生的事情。如果你能证明不是这样,我会要求你提供一个小的可复制的例子。理想情况下,您应该显示编译项目的内容

  2. # 2 楼答案

    我不想用占位符覆盖这个类,而是想为您的问题推荐一种替代方法。您可以使用Spring的Profile功能

    根据环境的不同更改类会更简单、更安全

    <beans>
        <beans profile="dev">
            <bean id="myBean" class="dev.impl.MyBean" />
        </beans
        <beans profile="prod">
            <bean id="myBean" class="prod.impl.MyBean" />
        </beans
    </beans>
    

    然后,通过将以下系统属性添加到服务器-Dspring.profiles.active="dev",可以在开发中激活给定的配置文件

    您可以通过将以下内容添加到web.xml中来定义默认配置文件:

    <context-param>
        <param-name>spring.profiles.default</param-name>
        <param-value>prod</param-value>
    </context-param>
    
  3. # 3 楼答案

    据我所知,属性占位符是相互失败的。这意味着,如果它无法在您的计算机上找到文件configuration.properties,则该属性不会初始化

    要批准此假设,请尝试“中断”同事计算机上的应用程序:将位置更改为错误的位置,例如classpath:/configuration12345.properties。我相信这个问题也会出现在他的机器上

    现在,检查您的环境中出现了什么问题,以及为什么在那里找不到此文件

    但是:你对个人资料有什么不满吗?Spring提供了一个非常酷的特性,它完全适合您的用例:spring profiles