簡體   English   中英

WEB-INF / myproject-servlet.xml與WEB-INF / web.xml

[英]WEB-INF/myproject-servlet.xml versus WEB-INF/web.xml

我花了幾天的時間來修復Spring項目中的錯誤。 長期以來,我在錯誤日志中的主要問題是:

Bean already exists

我有兩個文件:

WEB-INF/myproject-servlet.xml
WEB-INF/web.xml

在第一個中,我可以輸入以下內容(假設我有一個管理動物園動物的應用程序):

<context:component-scan base-package="com.my.package.animals" />

以此(據我所知),我們正在啟用Spring Bean自動發現。 所以現在,當我們運行應用程序時,Spring將從該程序包中獲取所有類,稍后它將遍歷resources目錄中的所有配置文件並初始化所有bean(放置在與給定程序包相關聯的配置文件中)。

第二個web.xml包含這樣的行

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/myproject-servlet.xml</param-value>
</context-param>

我還可以將路徑放置到我的配置文件中,例如:

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:animals-config.xml</param-value>
</context-param>

因此,現在,我在myproject-servlet.xml具有“自動檢測”功能,並且在web.xml針對相同對象的context-param

我的問題是,是否可能由此導致錯誤“ Bean已存在 ”? 我幾乎可以肯定的是,我檢查了所有bean的ID,並且沒有重復項。

所以我還有一個問題。 這樣做有什么好的方法? 創建新的配置文件時,應在哪里通知我的應用程序? myproject-servlet.xmlweb.xml 我真的需要清理我的應用程序,然后我將開始。

我檢查了一些示例,人們寧願不要在web.xml文件中放置多個<context-param> 簡單示例

先感謝您


好吧,我真的很想解決我的問題。

假設我有兩個軟件包:

com.my.pckg.a
com.my.pckg.b

與類

com.my.pckg.a.ClassA
com.my.pckg.b.ClassB

我在以下行中添加了myproject-servlet.xml

<context:component-scan base-package="com.my.pckg.a" />

我有一個配置文件myconfig.xml ,里面有基於類ClassAClassB的 bean。

假設我們有ID如下所示的bean:

ClassA: ida1, ida2
ClassB: idb1, idb2

因此,我正在運行碼頭服務器,問題是:

哪些bean將被初始化? 我只聲明了com.my.pckg.a包,因此從myconfig.xml ,spring應該只加載ida1ida2但是此文件還包括另一個類的bean。

所以最后...?


最后,我想我發現了一個問題。 web.xml文件中,我有一行:

<context:component-scan base-package="com.dirty.pckg" />

在這個包中,我有一個帶有@Controller注釋的DirtyClass類。 此類的一個字段是:

private static ApplicationContext context = new ClassPathXmlApplicationContext("dirty-config.xml");

因此,當我的應用程序啟動時,Spring將獲取DirtyClass (因為它具有@ )並進行映射。 因為os上下文的static修飾符,它會觸發讀取dirty-config.xml 這樣我就無法理解為什么我的代碼表現得很奇怪。

web.xml文件是Web應用程序的配置。 它與Spring無關。

contextConfigLocation context-param是一個Spring偵聽器,用於搜索Spring配置文件。 與春天有關。

您可以在web.xml注冊多個spring配置文件,但是這些文件不能定義相同的bean(bean id必須不同)。 您還只能擁有一個spring配置文件,該文件將自身包含其他配置文件,如下所述: http : //www.mkyong.com/spring/load-multiple-spring-bean-configuration-file/


回答另一個問題:

添加組件掃描后,您要求spring掃描com.my.pckg.a程序包以com.my.pckg.a @ Service,@ com.my.pckg.a等注釋。...組件掃描不是其余配置的過濾器,而是一個配置本身。 因此,您添加組件掃描的事實將不會更改myconfig.xml的行為。 ida1,ida2和idb1,idb2都將被實例化。

我真的不了解您要使用配置文件來完成的工作。 也許如果您解釋您的需求,我們可以幫助您為您設置正確的配置。

web.xml是配置文件。 它具有應用程序的類(例如偵聽器,過濾器,過濾器映射,servlet,servlet映射),應用程序的資源和配置(例如上下文參數,diplayname,錯誤頁面,會話配置)以及網絡服務器如何使用它們來處理它們網絡請求。 當Web服務器收到對應用程序的請求時,它將使用web.xml將請求的URL映射到應該處理該請求的代碼。

談到web.xml中應包含的內容以及myproject-servlet.xml中應包含的內容:
1)在Spring中,ApplicationContext可以是分層的。 一個ApplicationContext可以有多個子ApplicationContext,並且只能有一個父。 子級ApplicationContext中的Bean可以訪問父級中的Bean。

2)DispatcherServlet使用可配置的處理程序映射,視圖分辨率配置(用於應用程序的哪種視圖模板,例如jsp)將請求調度到處理程序(控制器)。

牢記這兩點,我們的web.xml應該類似於:

    <!--Root web application context(Parent context) - beans for service or persistence layer should be in this -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:service-layer-beans.xml</param-value>
    </context-param>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <servlet>
        <!--DispatcherServlet loads its configuration into its own context(chile context) and refers Root web application context as a parent, so it have access to beans in parent context and can override it but not vice versa.-->
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/myproject-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>*.htm</url-pattern>
    </servlet-mapping>

暫無
暫無

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

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