首页 文章

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

提问于
浏览
335
  • 在Spring Framework中是否 applicationContext.xmlspring-servlet.xml 相关?

  • applicationContext.xml 中声明的属性文件是否可用于 DispatcherServlet

  • 在相关的说明中,为什么我需要一个 *-servlet.xml ?为什么单独 applicationContext.xml 不足?

6 回答

  • 401

    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 中的 beans 可以在 applicationContext.xml 中引用bean,但反之亦然 .

    所有Spring MVC控制器都必须进入 spring-servlet.xml 环境 .

    在大多数简单的情况下, applicationContext.xml 上下文是不必要的 . 它通常用于包含在webapp中的所有servlet之间共享的bean . 如果你只有一个servlet,那么除非你有特定的用途,否则没什么意义 .

  • 10

    场景1

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

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

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

    Conclusion :在场景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中实例化 .

    Conclusion :在场景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 .

    Conclusion :在场景3中,applicationContext与 DispatcherServlet 无关 .

    场景4

    在带有spring MVC的web应用程序中 . 用于servlet和applicationContext.xml的springweb-servlet.xml,用于访问服务器程序中的业务服务或访问另一个服务器程序中的DB服务 .

    在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 .

    现在它清楚地说明了为什么它们在哪种情况下很重要 .

  • 4

    还有一点我想补充一点 . 在 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>
    
  • 4

    简单来说,

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

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

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

  • 99

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

  • 52

    在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>
    

相关问题