applicationContext.xml
和spring-servlet.xml
關聯? applicationContext.xml
聲明的屬性文件是否可用於DispatcherServlet
? *-servlet.xml
? 爲何僅applicationContext.xml
不夠? 我想補充一點。 在spring-servlet.xml
咱們包括對Controller軟件包的組件掃描。 在下面的示例中,咱們包括控制器包的過濾器註釋。 java
<!-- Scans for annotated @Controllers in the classpath --> <context:component-scan base-package="org.test.web" use-default-filters="false"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan>
在applicationcontext.xml
咱們爲除控制器以外的其他軟件包添加了過濾器。 web
<context:component-scan base-package="org.test"> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan>
在客戶端應用程序中(應用程序不是Web應用程序,例如多是swing應用程序) spring
private static ApplicationContext context = new ClassPathXmlApplicationContext("test-client.xml"); context.getBean(name);
不須要web.xml 。 ApplicationContext做爲獲取bean服務的容器。 無需Web服務器容器。 在test-client.xml中 ,能夠有不帶遠程處理的簡單bean,帶遠程處理的bean。 express
結論 :在方案1中,applicationContext和DispatcherServlet
不相關。 編程
在服務器應用程序中(部署在服務器中的應用程序,例如Tomcat)。 經過從客戶端程序(例如,Swing應用)遠程處理訪問的服務 服務器
在web.xml中定義偵聽器 app
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
在服務器啓動時, ContextLoaderListener
實例化applicationContext.xml中定義的bean。 webapp
假設您在applicationContext.xml中定義瞭如下內容: ide
<import resource="test1.xml" /> <import resource="test2.xml" /> <import resource="test3.xml" /> <import resource="test4.xml" />
從全部四個配置文件test1.xml , test2.xml , test3.xml , test4.xml實例化Bean 。 url
結論 :在方案2中,applicationContext和DispatcherServlet
不相關。
在帶有Spring MVC的Web應用程序中。
在web.xml中定義:
<servlet> <servlet-name>springweb</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>springweb</servlet-name> <url-pattern>*.action</url-pattern> </servlet-mapping>
Tomcat啓動時,將實例化springweb-servlet.xml中定義的bean。 DispatcherServlet
擴展了FrameworkServlet
。 在FrameworkServlet
bean實例化爲springweb。 在咱們的例子中, springweb是FrameworkServlet。
結論 :在方案3中,applicationContext和DispatcherServlet
不相關。
在帶有Spring MVC的Web應用程序中。 用於servlet的springweb-servlet.xml和用於訪問服務器程序中的業務服務或用於訪問另外一個服務器程序中的DB服務的applicationContext.xml 。
在web.xml中 ,定義瞭如下內容:
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <servlet> <servlet-name>springweb</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>springweb</servlet-name> <url-pattern>*.action</url-pattern> </servlet-mapping>
在服務器啓動時, ContextLoaderListener
實例化applicationContext.xml中定義的bean; 假設您已在此處聲明:
<import resource="test1.xml" /> <import resource="test2.xml" /> <import resource="test3.xml" /> <import resource="test4.xml" />
全部的bean都從全部四個test1.xml , test2.xml , test3.xml , test4.xml實例化。 在applicationContext.xml中定義的bean實例完成以後,對springweb-servlet.xml中定義的bean進行實例化。
所以,實例化順序爲:根(應用程序上下文),而後是FrameworkServlet。
如今應該弄清楚爲何它們在哪一種狀況下很重要。
應用程序上下文提供了一種解決文本消息的方法,包括對這些消息的支持。 應用程序上下文提供了一種加載文件資源(例如圖像)的通用方法。 應用程序上下文能夠將事件發佈到註冊爲偵聽器的Bean。 能夠在應用程序上下文中聲明性地處理對容器或容器中的Bean進行的某些操做,這些操做必須經過Bean工廠以編程方式進行處理。 ResourceLoader支持:Spring的Resource接口爲處理低級資源提供了靈活的通用抽象。 應用程序上下文自己就是ResourceLoader,所以使應用程序能夠訪問特定於部署的Resource實例。 MessageSource支持:應用程序上下文實現MessageSource,該接口用於獲取本地化消息,實際實現可插入
簡單來講
applicationContext.xml
定義了全部servlet之間共享的bean。 若是您的應用程序具備多個servlet,那麼在applicationContext.xml
定義公共資源將更有意義。
spring-servlet.xml
定義僅與該servlet相關的bean。 這是調度程序servlet。 所以,您的Spring MVC控制器必須在此文件中定義。
若是僅在Web應用程序中運行一個servlet,那麼在spring-servlet.xml
中定義全部bean並無錯。
Spring使您能夠在父子層次結構中定義多個上下文。
applicationContext.xml
爲「根webapp上下文」(即與Webapp關聯的上下文)定義了bean。
spring-servlet.xml
(或您所謂的其餘名稱)爲一個servlet的應用程序上下文定義了bean。 能夠有許多這樣的web應用程序,在每一個Spring的servlet之一(例如spring1-servlet.xml
的servlet的spring1
, spring2-servlet.xml
的servlet的spring2
)。
spring-servlet.xml
中的Bean能夠引用applicationContext.xml
Bean,反之亦然。
全部Spring MVC控制器都必須位於spring-servlet.xml
上下文中。
在大多數簡單狀況下,不須要applicationContext.xml
上下文。 它一般用於包含在webapp中全部servlet之間共享的bean。 若是隻有一個servlet,那麼除非您有特定用途,不然沒有太多意義。