0

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

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

所以我需要在某个地方放置一个属性占位符。

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 文件中,因为我有一个很长的“位置”属性。还有一些作业会用到business-context.xml,所以不能省略。

有什么方法可以让 business-context.xml 中定义的占位符在 mvc-dispatcher-servlet.xml 中也可见?

4

1 回答 1

1

属性占位符的ABeanFactoryPostProcessor只会对定义它的应用程序上下文运行(并且可见)。这是设计使然。因此,不,您不能使父级的属性占位符对子上下文可见(您可以使用一些讨厌的技巧)。

作为一种解决方法,您可以在 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 ../>的内容并简单地引用已加载的属性。另一个优点是属性只加载一次。

于 2013-09-04T07:33:30.270 回答