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

标签 java spring spring-mvc

我正在使用 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/

相关文章:

mysql - 在 MySQL 数据库中正确创建和持久化

java - Ajax post调用应该返回到html页面

spring-mvc - 如何在tapestry中使用Spring MVC资源静态图像

java - spring mvc servlet初始化

javascript - 在 Spring MVC 中动态添加表行并绑定(bind)到服务器端

java - mp3transform 文档

java - 在已有的类中实现 Spring 事务处理

java - 如何使用参数从表中选择数据

java - 将动态 Java 应用程序重新编译为 native Windows 可执行文件

java - 在 print 语句中使用类型转换运算符