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
# 1 楼答案
以下假设为Spring 3.1+
我可以肯定地告诉你这一点。让Spring在类中使用
ClassNotFoundException
失败表示它没有解析占位符
当您指定
Spring使用
PropertyPlaceholderBeanDefinitionParser
来注册PropertySourcesPlaceholderConfigurer
或PropertyPlaceholderConfigurer
bean,这将执行占位符解析PropertySourcesPlaceholderConfigurer
是一个BeanFactoryPostProcessor
。这意味着它可以修改bean定义。如果无法解析占位符,则进程将失败,并显示一个IllegalArgumentException
,表明无法解析占位符如果您是说
${type}
没有被解析,那么就没有创建PropertySourcesPlaceholderConfigurer
或PropertyPlaceholderConfigurer
bean。这可能意味着您的上下文没有根据你向我们展示的信息,我认为这就是正在发生的事情。如果你能证明不是这样,我会要求你提供一个小的可复制的例子。理想情况下,您应该显示编译项目的内容
# 2 楼答案
我不想用占位符覆盖这个类,而是想为您的问题推荐一种替代方法。您可以使用Spring的Profile功能
根据环境的不同更改类会更简单、更安全
然后,通过将以下系统属性添加到服务器
-Dspring.profiles.active="dev"
,可以在开发中激活给定的配置文件您可以通过将以下内容添加到
web.xml
中来定义默认配置文件:# 3 楼答案
据我所知,属性占位符是相互失败的。这意味着,如果它无法在您的计算机上找到文件
configuration.properties
,则该属性不会初始化要批准此假设,请尝试“中断”同事计算机上的应用程序:将位置更改为错误的位置,例如
classpath:/configuration12345.properties
。我相信这个问题也会出现在他的机器上现在,检查您的环境中出现了什么问题,以及为什么在那里找不到此文件
但是:你对个人资料有什么不满吗?Spring提供了一个非常酷的特性,它完全适合您的用例:spring profiles