Spring Framework中applicationContext.xml和spring-servlet.xml之间的区别

  • 在Spring Framework中, applicationContext.xmlspring-servlet.xml关联?
  • applicationContext.xml声明的属性文件是否可用于DispatcherServlet
  • 在相关说明中,为何我彻底须要*-servlet.xml ? 为何仅applicationContext.xml不够?

#1楼

我想补充一点。 在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>

#2楼

场景1

在客户端应用程序中(应用程序不是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不相关。 编程

方案2

在服务器应用程序中(部署在服务器中的应用程序,例如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.xmltest2.xmltest3.xmltest4.xml实例化Beanurl

结论 :在方案2中,applicationContext和DispatcherServlet不相关。

场景3

在带有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不相关。

方案4

在带有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.xmltest2.xmltest3.xmltest4.xml实例化。 在applicationContext.xml中定义的bean实例完成以后,对springweb-servlet.xml中定义的bean进行实例化。

所以,实例化顺序为:根(应用程序上下文),而后是FrameworkServlet。

如今应该弄清楚为何它们在哪一种状况下很重要。


#3楼

应用程序上下文提供了一种解决文本消息的方法,包括对这些消息的支持。 应用程序上下文提供了一种加载文件资源(例如图像)的通用方法。 应用程序上下文能够将事件发布到注册为侦听器的Bean。 能够在应用程序上下文中声明性地处理对容器或容器中的Bean进行的某些操做,这些操做必须经过Bean工厂以编程方式进行处理。 ResourceLoader支持:Spring的Resource接口为处理低级资源提供了灵活的通用抽象。 应用程序上下文自己就是ResourceLoader,所以使应用程序能够访问特定于部署的Resource实例。 MessageSource支持:应用程序上下文实现MessageSource,该接口用于获取本地化消息,实际实现可插入


#4楼

简单来讲

applicationContext.xml定义了全部servlet之间共享的bean。 若是您的应用程序具备多个servlet,那么在applicationContext.xml定义公共资源将更有意义。

spring-servlet.xml定义仅与该servlet相关的bean。 这是调度程序servlet。 所以,您的Spring MVC控制器必须在此文件中定义。

若是仅在Web应用程序中运行一个servlet,那么在spring-servlet.xml中定义全部bean并无错。


#5楼

Spring使您能够在父子层次结构中定义多个上下文。

applicationContext.xml为“根webapp上下文”(即与Webapp关联的上下文)定义了bean。

spring-servlet.xml (或您所谓的其余名称)为一个servlet的应用程序上下文定义了bean。 能够有许多这样的web应用程序,在每一个Spring的servlet之一(例如spring1-servlet.xml的servlet的spring1spring2-servlet.xml的servlet的spring2 )。

spring-servlet.xml中的Bean能够引用applicationContext.xml Bean,反之亦然。

全部Spring MVC控制器都必须位于spring-servlet.xml上下文中。

在大多数简单状况下,不须要applicationContext.xml上下文。 它一般用于包含在webapp中全部servlet之间共享的bean。 若是只有一个servlet,那么除非您有特定用途,不然没有太多意义。

相关文章
相关标签/搜索