簡體   English   中英

Web應用程序的context-param和servlet的init-param之間的區別?

[英]Difference Between web-app's context-param and servlet's init-param?

我正在使用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中也可見?

屬性占位符所在的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 ../> ,並僅引用已加載的屬性。 增加的優點是,屬性僅加載一次。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM