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,那么除非您有特定用途,不然没有太多意义。