我正在使用 Spring MVC。在 Controller 类中,我想使用 @Value 注释来注入(inject)来自属性文件的值:
@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 中。它不起作用:“无法 Autowiring 字段”。
然后我把它放在mvc-dispatcher-servlet.xml中,它就可以工作了。
所以我对这两个上下文感到困惑,它们是相同的还是不同的?因为我在business-content.xml中定义的bean可以 Autowiring ,但@Value不起作用。
我不想将占位符放在两个 xml 文件中,因为我有一个很长的“位置”属性。另外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" />
定义相同的<context:property-placeholder ../>
在 xml 上下文中并简单地引用已加载的属性。附加优点是属性仅加载一次。
关于java - web-app 的 context-param 和 servlet 的 init-param 之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18607716/