我使用的是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文件中都放占位符,因为我有一个长的"location"属性。此外,business-context.xml将被一些作业使用,因此不能省略它。
有什么方法可以让business-context.xml中定义的占位符在mvc-dispatcher-servlet.xml中也可见?
属性占位符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 ../>
,并简单地引用已加载的属性。增加的优点是属性只加载一次。