我们有一个Spring托管应用程序,它使用另一个jar作为依赖项,它包含一个Spring托管服务类,需要使用从属性文件注入的一些值
Spring上下文设置的主要应用程序
preg_replace
从依赖jar调用服务的类
public static void main(String[] args) {
GenericXmlApplicationContext appContext = new GenericXmlApplicationContext("applicationContext.xml");
SomeClass someClass = (SomeClass) appContext.getBean("someClass");
someClass.someMethod();
...
主应用程序的applicationContext.xml
public class SomeClass {
private ServiceFromTheOtherJar serviceFromTheOtherJar;
public SomeClass(ServiceFromTheOtherJar serviceFromTheOtherJar) {
this.serviceFromTheOtherJar = serviceFromTheOtherJar;
}
public void someMethod() {
serviceFromTheOtherJar.call();
...
依赖jar中的服务类
<bean name="serviceFromTheOtherJar" class="com...ServiceFromTheOtherJar"/>
<bean name="someClass" class="com...SomeClass">
<constructor-arg ref="serviceFromTheOtherJar"/>
</bean>
当然,我们在依赖jar中有一个application.properties文件,它包含我们想要注入someFieldWeWantToFillFromPropertyFile的属性值
现在我们可以将依赖jar作为依赖项添加到主应用程序中;当主应用程序正在执行时,它的Spring上下文正在设置好,并且按预期调用ServiceFromTheOtherJar.call()方法;然而someFieldWeWantToFillFromPropertyFile并没有从我们迄今为止尝试过的属性文件中填充(例如@PropertySource({&#34; application.properties&#34;}),Environment.getProperty(...)等。)
限制
我们在两个罐子里都有Spring 3版本,由于部署环境,这个版本必须保持不变;所以Spring 4的解决方案是不可能的
如上所示,主应用程序当前使用GenericXmlApplicationContext,并且更改它似乎表明应用程序的重大重写。因此例如似乎无法在ServiceFromTheOtherJar上使用@Service注释,因为它在执行和上下文设置期间导致了BeanCreationException
答案 0 :(得分:1)
要从属性文件中读取值,您必须将以下bean添加到applicationContext.xml。
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations" value="classpath:application.properties" />
</bean>
假设application.properties文件包含这样的定义
myValue=Hello World
service-bean的定义应该像这样扩展
<bean name="serviceFromTheOtherJar" class="com...ServiceFromTheOtherJar">
<property name="someFieldWeWantToFillFromPropertyFile" value="${myValue}" />
</bean>
现在,Spring将在类路径中查找application.properties文件,并根据myValue设置服务bean的属性。