web-app的context-param和servlet的init-param之间的区别?

时间:2013-09-04 07:20:00

标签: java spring spring-mvc

我正在使用Spring MVC。在Controller类中,我想使用@Value注释来注入来自属性文件的值:

@Value("${upload.dir}")
private String uploadDir;

所以我需要在某处放置一个property-placeholder。

web.xml是典型的:

<servlet>
    <servlet-name>mvc-dispatcher</servlet-name>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring/mvc-dispatcher-servlet.xml</param-value>
    </init-param>
    ...
</servlet>

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:spring/business-context.xml</param-value>
</context-param>

首先,我将占位符放在business-context.xml中。它不起作用:“无法自动装配字段”。

然后我把它放在mvc-dispatcher-servlet.xml中,它可以工作。

所以我对这两种情况感到困惑,它们是相同还是不同?因为我在business-content.xml中定义的bean可以自动装配,但@Value不起作用。

我不想将占位符放在两个xml文件中,因为我有一个很长的'location'属性。此外,某些作业将使用business-context.xml,因此不能省略它。

在mvc-dispatcher-servlet.xml中,是否可以在business-context.xml中定义占位符的任何方法?

1 个答案:

答案 0 :(得分:1)

属性占位符的BeanFactoryPostProcessor只对其定义的应用程序上下文进行操作(并且可见)。这是设计使然。所以不,你不能从父级可见的子语境中创建一个属性占位符(以及你可以使用的一些讨厌的黑客)。

作为一项解决方法,您可以在business-context.xml中执行以下操作

<util:properties id="applicationProperties" location="path-to-your-very-long-location" />
<context:property-placeholder properties-ref="applicationProperties" />

,这在你的mvc-dispatcher-servlet.xml中。

<context:property-placeholder properties-ref="applicationProperties" />

在两个xml上下文中定义相同的<context:property-placeholder ../>,并简单地引用已加载的属性。添加优势的属性仅加载一次。