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

时间:2010-09-06 14:05:30

标签: java spring

  • Spring Framework中是否applicationContext.xmlspring-servlet.xml相关?
  • applicationContext.xml中声明的属性文件是否可用于DispatcherServlet
  • 在相关说明中,为什么我需要*-servlet.xml?为什么applicationContext.xml单独不足?

6 个答案:

答案 0 :(得分:414)

Spring允许您在父子层次结构中定义多个上下文。

applicationContext.xml定义“root webapp context”的bean,即与webapp关联的上下文。

spring-servlet.xml(或者你称之为的任何其他东西)为一个servlet的app上下文定义bean。在webapp中可以有很多这样的,每个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,那么除非你有特定的用途,否则没什么意义。

答案 1 :(得分:101)

场景1

在客户端应用程序中(应用程序不是Web应用程序,例如可能是swing应用程序)

private static ApplicationContext context = new  ClassPathXmlApplicationContext("test-client.xml");

context.getBean(name);

不需要 web.xml 。 ApplicationContext作为获取bean服务的容器。不需要Web服务器容器。 在 test-client.xml 中,可以有没有远程处理的Simple bean,带有远程处理的bean。

结论:在场景1中,applicationContext与DispatcherServlet无关。

场景2

在服务器应用程序中(部署在服务器中的应用程序,例如Tomcat)。通过客户端程序远程访问服务(例如Swing应用程序)

web.xml中定义侦听器

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

在服务器启动时ContextLoaderListener实例化 applicationContext.xml 中定义的bean。

假设您已在 applicationContext.xml 中定义了以下内容:

<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

结论:在场景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.xml test2.xml test3.xml test4.xml实例化的。 完成 applicationContext.xml 中定义的bean实例化后,将实例化 springweb-servlet.xml 中定义的bean。

因此实例化顺序是root是应用程序上下文,然后是FrameworkServlet。

现在它明确了为什么它们在哪种情况下很重要。

答案 2 :(得分:53)

我想补充一点。在spring-servlet.xml中,我们包含了Controller包的组件扫描。 在下面的示例中,我们包含了控制器包的过滤器注释。

<!-- 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中,我们为除控制器之外的剩余包添加过滤器。

<context:component-scan base-package="org.test">
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

答案 3 :(得分:10)

简单来说,

applicationContext.xml定义了所有servlet之间共享的bean。如果您的应用程序有多个servlet,那么在applicationContext.xml中定义公共资源会更有意义。

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

如果在Web应用程序中只运行一个servlet,则定义spring-servlet.xml中的所有bean没有任何问题。

答案 4 :(得分:5)

在Servlet技术中,如果要将任何输入传递给特定的servlet,则需要传递init param,如下面的代码。

 <servlet>
    <servlet-name>DBController</servlet-name>
    <servlet-class>com.test.controller.DBController</servlet-class>
    <init-param>
        <param-name>username</param-name>
        <param-value>John</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>DBController</servlet-name>
    <url-pattern>/DBController</url-pattern>
</servlet-mapping>

如果你想传递一些对于所有servlet都很常见的put,那么你需要配置上下文参数。实施例

 <context-param>
    <param-name>email</param-name>
    <param-value>admin@example.com</param-value>
</context-param>

因此,当我们使用Spring MVC时,我们需要向Spring提供的一些信息,即DispatcherServlet通过init param提供一些信息。 所以配置就像休闲一样,这里我们提供spring-servlet.xml作为DispatcherServlet的init参数。

 <?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
              http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    id="WebApp_ID" version="3.0">
    <display-name>Spring MVC App</display-name>

    <servlet>
        <servlet-name>SpringController</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/spring-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>SpringController</servlet-name>
        <url-pattern>*.htm</url-pattern>
    </servlet-mapping>
</web-app>

我们需要一些上下文参数。这适用于整个应用。 所以我们可以提供applicationcontext.xml的根上下文 配置如下:

    <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/applicationcontext.xml</param-value>
</context-param>
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<servlet>
        <servlet-name>SpringController</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/spring-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>SpringController</servlet-name>
        <url-pattern>*.htm</url-pattern>
    </servlet-mapping>

答案 5 :(得分:4)

应用程序上下文提供了解析文本消息的方法,包括支持这些消息的i18n。 应用程序上下文提供了加载文件资源(如图像)的通用方法。 应用程序上下文可以将事件发布到注册为侦听器的bean。 容器中的某些操作或容器中的bean(必须以bean工厂以编程方式处理)可以在应用程序上下文中以声明方式处理。 ResourceLoader支持:Spring的Resource接口是一个灵活的通用抽象,用于处理低级资源。应用程序上下文本身是ResourceLoader,因此为应用程序提供对特定于部署的Resource实例的访问权限。 MessageSource支持:应用程序上下文实现MessageSource,一个用于获取本地化消息的接口,实际实现是可插入的