1. 程式人生 > >spring-servlet.xml 和 application.xml 配置含義及bean被載入兩次的問題

spring-servlet.xml 和 application.xml 配置含義及bean被載入兩次的問題

最近在遷移一個專案,原本是RPC服務與API水平拆分的,現在需要垂直拆分,每個RPC服務自己提供http介面,我負責遷移RPC部分,另一個同事負責遷移API部分,涉及到一些配置遷移的時候出現了些小狀況,所以查了一些資料,大致梳理了下Spring、SpringMVC配置檔案之間的關係及一些問題。

在我們進行Spring-servlet進行開發的時候,經常會遇到配置檔案配置的問題,要徹底的解決這個問題,我們需要了解springMVC設計的基本架構。SpringMVC的配置分為兩部分application.xml和spring-servlet.xml,application.xml:對應的是系統級別的配置,作用範圍是系統上下文;spring-servlet.xml:對應的是controller級別的配置,作用範圍是控制層上下文。因為 application.xml 是系統級別的上下文,所以它的初始化需要放到web.xml中的<context-param>標籤中,同時其他的類似定時任務的配置檔案等等都是放在這個標籤下進行初始化的。因為spring-servlet.xml只是 controller 級別的上下文,說白了就是 servlet 級別的初始化,它不涉及到除了轉發之外的任何實體,所以它的作用範圍僅僅限制在 servlet 級別,所以它的初始化應該是跟spring 的 DispatcherServlet 初始化在一起,所以就是在 <servlet> 標籤中初始化的。它有一個預設值就是【/WEB-INF/xxx-servlet.xml 】,注意配置檔案的對應的名稱是【 servlet-name】-servlet.xml,所以如果你沒有給servlet 制定配置檔案的位置,並且在預設位置下也沒有配置檔案,那麼系統啟動的時候就會報錯。

sping+springmvc的框架中,IOC容器的載入過程基本上是先載入ContextLoaderListener,然後生成一個ioc容器。然後再例項化DispatchServlet時候在載入對應的配置檔案,再次生成Controller相關的IOC容器,在DispatcherServlet中可以引用由ContextLoaderListener所建立的ApplicationContext,而反過來不行。

如果對於這兩份配置沒有很好的認識,就會發生重複載入配置檔案,導致bean被多次載入的問題。

問題就出在ContextLoaderListener和DispatcherServlet,他們都可以引入spring,而且每個引入都會例項化一次bean。如果把兩個引入方式配置到同一個檔案,那麼就會導致一個bean被例項化兩次。但是,當我們使用Spring Bean的時候,只會用到DispatcherServlet下的Bean,而不會用到ContextLoaderListener下的Bean,這就會導致ContextLoaderListener的bean不會被用到。

使用ContextLoaderlistener和DispatcherServlet引入Spring的區別

1、ContextLoaderListener和DispatcherServlet都會生成一個WebApplicationContext(上下文),分別以不同的name存放在容器中。
2、同一個容器裡,只允許有一個ContextLoaderListener但是可以用多個DispatcherServlet。 DispatcherServlet的context總是ContextLoaderListener的context的子類。
3、在獲取bean的時候,會先從DispatcherServlet的context獲取,如果沒有再從ContextLoaderListener的context獲取,這就解釋了上面的第一點。
4、如果兩者用的是同一份配置檔案,或者他們的定義bean有交叉就會造成部分bean永遠不會被用到(洩漏)。
5、DispatcherServlet還會載入與SpringMVC相關的bean,如RequestMapping。。。。

可以通過以下方式來處理

1、通過配置exclude-filter來避免重複載入的問題
<context:component-scan base-package="com.projects.system">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
</context:component-scan>
2、分開掃描,養成良好習慣:
DispatchServlet.xml <context:component-scan base-package="xx.xx.xx.controller" />
applicationContext.xml <context:component-scan base-package="xx.xxx.xx.dao,xx.xx.xxx.service"/>
對於 servlet配置檔案裡面應該初始化的東西,除了檢視的解析方式、靜態資原始檔的存放位置、controller的初始化方式之外,其他的都不應該放在 servlet 配置檔案中,因為它只負責請求的轉發,返回結果的解析以及靜態資原始檔的解析,其他的物件的初始化,定時任務等等都不應該放到這個配置檔案下進行管理。

相關推薦

spring-servlet.xml application.xml 配置含義bean載入的問題

最近在遷移一個專案,原本是RPC服務與API水平拆分的,現在需要垂直拆分,每個RPC服務自己提供http介面,我負責遷移RPC部分,另一個同事負責遷移API部分,涉及到一些配置遷移的時候出現了些小狀

web.xmlspring-servlet.xml application.xml 配置位置含義

在我們進行 Spring-servlet 進行開發的時候,經常會遇到配置檔案配置的問題,要徹底的解決這個問題,我們需要了解 springMVC 設計的基本架構 1.SpringMVC 的配置分為兩部分 application.xml 和 spring-servl

Spring MVC的default-servlet-handlerannotation-driven配置

spring mvc serlvet 使用spring通常配置url-pattern為/時,會代替web服務器的servlet成為default servlet,靜態資源無法訪問,添加<mvc:default-servlet-handler/>指定web服務器的servlet為defa

SSM的XMLWEB.XML配置

erl 視圖 核心 contex select 3.0 agg oct eth 顯示層(handler/controller):   request請求到springmvc的前端控制器,從處理器映射器找相應的handler(用@RequestMapping(" ")標註,

Struts 2.5.17 web.xmlstruts.xml預設配置

<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/

配置Tomcat時web.xml、server.xmlcontent.xml自動還原問題

當我們在處理中文亂碼或是配置資料來源時,我們要修改Tomcat下的server.xml和content.xml檔案。 但是當我們修改完後重啟Tomcat伺服器時發現xml檔案又被還原了,修改無效果。 為什麼會還原? Tomcat伺服器在Eclipse中啟動時,會自動釋出Eclipse中部

hibernate配置檔案hibernate.cfg.xml.hbm.xml的詳細解釋

hibernate.cfg.xml -標準的XML檔案的起始行,version='1.0'表明XML的版本,encoding='gb2312'表明XML檔案的編碼方式--> <?xml version='1.0' enc

structs2的web.xmlstruct.xml配置檔案的配置

            上篇博文提到了structs2的下載和使用。本文將簡介一下兩個主要的配置檔案web.xml和struct.xml. 1.web.xml檔案 <?xml version="1.0" encoding="UTF-8"?> <web-

struts-2.3.34struts-2.5.16引入jar以及配置web.xmlstruts.xml

struts-2.3.341. 引入jarasm-3.3.jar asm-commons-3.3.jar asm-tree-3.3.jar commons-fileupload-1.3.1.jar commons-io-2.2.jar commons-lang3-3.1.ja

struts2初學的相關配置(struts.xmlweb.xml)

Struts2框架概述:1、Struts2框架應用於Java EE三層結構中的WEB層(檢視層);            2、Struts2框架在Struts1和webwork基礎上發展的全新框架;            3、WEB層中的其他框架(Spring MVC);開發

maven專案的JDK版本的版本配置或者指定JDK版本,最實用的修改settings.xmlpom.xml修改方法,可以解決eplise中的90%因為jdk相容的問題,

公司近期匯入了一個專案,新專案剛剛匯入就有很多錯誤,這也是java專案的一個通病,根本的原因還是java的jvm虛擬機器的問題,還有各種依賴包的問題,有些問題很明顯,有些問題非常不明顯 下面我就把一些應為jdk版本引起的問題記錄下, 錯誤1:Dynamic We

[Struts2] 配置檔案struts.xmlweb.xml詳解

 配置檔案struts.xml和web.xml。 其實要使Struts2可以工作,配置很簡單,套模板就好了。而且基本與版本無關。 如,只要struts2需要的基本jar包已經引入,那麼直接配置一下web.xml和struts.xml檔案。 web.xml中包含: <

最全三大框架整合(使用對映)——struts.xmlweb.xml配置

<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundat

EJB2.0 HelloWorld 中 ejb-jar.xml jbossl.xml配置.

1.ejb-jar.xml 程式碼如下: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise J

利用反射與dom4j讀取javabean生成對應XML讀取XML得到對應的javabean物件集合

首先實現生成對應的JAVAbean的XML檔案方法 /** * DMO4J寫入XML * @param obj 泛型物件 * @param entityPropertys 泛型物件的List集合 * @param Encode

Springbootboot―― application.propertiesapplication.yml配置屬性大全

 application.properties和application.yml配置屬性 摘譯自:官方文件   可以在您的application.properties/application.yml檔案中新增。本節提供了一個列表、常見的SpringBoot屬性以及對使用

springmvc-沒有web.xmlspringmvc.xml你還可以執行起來springmvc嗎

前面也寫了幾篇有關springboot的簡單使用的文章,也寫了幾篇有關springcloud的文章,不過springcloud是基於springboot的。所以就來糾結一下springboot的吧。 springboot之所以可以不用使用任何的xml配置檔案就可

Spring的ProxyFactoryBeanBeanNameAutoProxyCreator的配置

<bean id="daoInterceptor" class="com.jask.spring.DiscountMethodInterceptor"></bean> <bean id="testService" class="org.sp

DOM,SAX,JDOM,DOM4J優缺點比較生產xml解析xml

下載必要的jar包: activation.jar commons-logging-1.0.4.jar dom4j-1.6.1.jar jaxen-1.1.1.jar jdom-1.0.jar 一、DOM 解析器讀入整個文件,然後構建一個駐留記憶體的樹結構,使用 DOM 介

javaWeb學習(2)——web.xmlpom.xml都是幹嘛用的

web.xml和pom.xml看起來差不多都是仨字母,檔案字尾都一樣 對於初學者來講,剛接觸這裡面的東西,感覺亂七八糟的傻傻弄不清楚 我也以一個初學者的角度,說說自己的理解 一、POM啥意思呢,百度了一下叫專案物件模型------->該檔案用於管理:原始碼、配置檔案、