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.xml 中spring-servlet.xml 和 application.xml 配置位置及含義
在我們進行 Spring-servlet 進行開發的時候,經常會遇到配置檔案配置的問題,要徹底的解決這個問題,我們需要了解 springMVC 設計的基本架構 1.SpringMVC 的配置分為兩部分 application.xml 和 spring-servl
Spring MVC的default-servlet-handler和annotation-driven配置
spring mvc serlvet 使用spring通常配置url-pattern為/時,會代替web服務器的servlet成為default servlet,靜態資源無法訪問,添加<mvc:default-servlet-handler/>指定web服務器的servlet為defa
SSM的XML和WEB.XML的配置
erl 視圖 核心 contex select 3.0 agg oct eth 顯示層(handler/controller): request請求到springmvc的前端控制器,從處理器映射器找相應的handler(用@RequestMapping(" ")標註,
Struts 2.5.17 web.xml和struts.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.xml和content.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.xml和struct.xml兩個配置檔案的配置
上篇博文提到了structs2的下載和使用。本文將簡介一下兩個主要的配置檔案web.xml和struct.xml. 1.web.xml檔案 <?xml version="1.0" encoding="UTF-8"?> <web-
struts-2.3.34和struts-2.5.16引入jar以及配置web.xml和struts.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.xml和web.xml)
Struts2框架概述:1、Struts2框架應用於Java EE三層結構中的WEB層(檢視層); 2、Struts2框架在Struts1和webwork基礎上發展的全新框架; 3、WEB層中的其他框架(Spring MVC);開發
maven專案的JDK版本的版本配置或者指定JDK版本,最實用的修改settings.xml和pom.xml修改方法,可以解決eplise中的90%因為jdk相容的問題,
公司近期匯入了一個專案,新專案剛剛匯入就有很多錯誤,這也是java專案的一個通病,根本的原因還是java的jvm虛擬機器的問題,還有各種依賴包的問題,有些問題很明顯,有些問題非常不明顯 下面我就把一些應為jdk版本引起的問題記錄下, 錯誤1:Dynamic We
[Struts2] 配置檔案struts.xml和web.xml詳解
配置檔案struts.xml和web.xml。 其實要使Struts2可以工作,配置很簡單,套模板就好了。而且基本與版本無關。 如,只要struts2需要的基本jar包已經引入,那麼直接配置一下web.xml和struts.xml檔案。 web.xml中包含: <
最全三大框架整合(使用對映)——struts.xml和web.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.properties和application.yml配置屬性大全
application.properties和application.yml配置屬性 摘譯自:官方文件 可以在您的application.properties/application.yml檔案中新增。本節提供了一個列表、常見的SpringBoot屬性以及對使用
springmvc-沒有web.xml和springmvc.xml你還可以執行起來springmvc嗎
前面也寫了幾篇有關springboot的簡單使用的文章,也寫了幾篇有關springcloud的文章,不過springcloud是基於springboot的。所以就來糾結一下springboot的吧。 springboot之所以可以不用使用任何的xml配置檔案就可
Spring的ProxyFactoryBean和BeanNameAutoProxyCreator的配置
<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.xml和pom.xml都是幹嘛用的
web.xml和pom.xml看起來差不多都是仨字母,檔案字尾都一樣 對於初學者來講,剛接觸這裡面的東西,感覺亂七八糟的傻傻弄不清楚 我也以一個初學者的角度,說說自己的理解 一、POM啥意思呢,百度了一下叫專案物件模型------->該檔案用於管理:原始碼、配置檔案、