在Spring Framework中是否 applicationContext.xml 和 spring-servlet.xml 相关?
applicationContext.xml
spring-servlet.xml
applicationContext.xml 中声明的属性文件是否可用于 DispatcherServlet ?
DispatcherServlet
在相关的说明中,为什么我需要一个 *-servlet.xml ?为什么单独 applicationContext.xml 不足?
*-servlet.xml
Spring允许您在父子层次结构中定义多个上下文 .
applicationContext.xml 定义"root webapp context"的bean,即与webapp关联的上下文 .
spring-servlet.xml (或者你称之为的任何其他东西)为一个servlet的app上下文定义bean . 在webapp中可以有许多这样的,每个Spring servlet一个(例如 spring1-servlet.xml 用于servlet spring1 , spring2-servlet.xml 用于servlet spring2 ) .
spring1-servlet.xml
spring1
spring2-servlet.xml
spring2
spring-servlet.xml 中的 beans 可以在 applicationContext.xml 中引用bean,但反之亦然 .
所有Spring MVC控制器都必须进入 spring-servlet.xml 环境 .
在大多数简单的情况下, applicationContext.xml 上下文是不必要的 . 它通常用于包含在webapp中的所有servlet之间共享的bean . 如果你只有一个servlet,那么除非你有特定的用途,否则没什么意义 .
在客户端应用程序中(应用程序不是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 无关 .
在服务器应用程序(部署在服务器中的应用程序,例如Tomcat) . 从客户端程序远程访问服务(例如Swing应用程序)
在web.xml中定义监听器
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
在服务器启动时 ContextLoaderListener 实例化applicationContext.xml中定义的bean .
ContextLoaderListener
假设您已在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 无关 .
在带有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 .
FrameworkServlet
Conclusion :在场景3中,applicationContext与 DispatcherServlet 无关 .
在带有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;假设您在此声明:
这四个bean都是从所有四个test1.xml,test2.xml,test3.xml,test4.xml中实例化的 . 在applicationContext.xml中定义的bean实例化完成之后,将实例化springweb-servlet.xml中定义的bean .
所以实例化顺序是root是应用程序上下文,然后是FrameworkServlet .
现在它清楚地说明了为什么它们在哪种情况下很重要 .
还有一点我想补充一点 . 在 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 中,我们为除控制器之外的剩余包添加过滤器 .
applicationcontext.xml
<context:component-scan base-package="org.test"> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan>
简单来说,
applicationContext.xml 定义了所有servlet之间共享的bean . 如果您的应用程序有多个servlet,那么在 applicationContext.xml 中定义公共资源会更有意义 .
spring-servlet.xml 定义仅与该servlet相关的bean . 这是调度程序servlet . 因此,必须在此文件中定义Spring MVC控制器 .
如果在Web应用程序中只运行一个servlet,则定义 spring-servlet.xml 中的所有bean没有任何问题 .
应用程序上下文提供了解析文本消息的方法,包括支持这些消息的i18n . 应用程序上下文提供了加载文件资源(如图像)的通用方法 . 应用程序上下文可以将事件发布到注册为侦听器的bean . 容器中的某些操作或容器中的bean(必须以bean工厂以编程方式处理)可以在应用程序上下文中以声明方式处理 . ResourceLoader支持:Spring的Resource接口是一个灵活的通用抽象,用于处理低级资源 . 应用程序上下文本身是ResourceLoader,因此为应用程序提供对特定于部署的Resource实例的访问 . MessageSource支持:应用程序上下文实现MessageSource,一个用于获取本地化消息的接口,实际的实现是可插入的
在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>
6 回答
Spring允许您在父子层次结构中定义多个上下文 .
applicationContext.xml
定义"root webapp context"的bean,即与webapp关联的上下文 .spring-servlet.xml
(或者你称之为的任何其他东西)为一个servlet的app上下文定义bean . 在webapp中可以有许多这样的,每个Spring servlet一个(例如spring1-servlet.xml
用于servletspring1
,spring2-servlet.xml
用于servletspring2
) .spring-servlet.xml
中的 beans 可以在applicationContext.xml
中引用bean,但反之亦然 .所有Spring MVC控制器都必须进入
spring-servlet.xml
环境 .在大多数简单的情况下,
applicationContext.xml
上下文是不必要的 . 它通常用于包含在webapp中的所有servlet之间共享的bean . 如果你只有一个servlet,那么除非你有特定的用途,否则没什么意义 .场景1
在客户端应用程序中(应用程序不是Web应用程序,例如可能是swing app)
不需要web.xml . ApplicationContext作为获取bean服务的容器 . 不需要Web服务器容器 . 在test-client.xml中可以有Simple bean,没有远程处理,bean有远程处理 .
Conclusion :在场景1中,applicationContext和
DispatcherServlet
无关 .场景2
在服务器应用程序(部署在服务器中的应用程序,例如Tomcat) . 从客户端程序远程访问服务(例如Swing应用程序)
在web.xml中定义监听器
在服务器启动时
ContextLoaderListener
实例化applicationContext.xml中定义的bean .假设您已在applicationContext.xml中定义了以下内容:
bean从所有四个配置文件test1.xml,test2.xml,test3.xml,test4.xml中实例化 .
Conclusion :在场景2中,applicationContext与
DispatcherServlet
无关 .场景3
在带有spring MVC的Web应用程序中 .
在web.xml中定义:
当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中定义了以下内容:
在服务器启动时,
ContextLoaderListener
实例化applicationContext.xml中定义的bean;假设您在此声明:这四个bean都是从所有四个test1.xml,test2.xml,test3.xml,test4.xml中实例化的 . 在applicationContext.xml中定义的bean实例化完成之后,将实例化springweb-servlet.xml中定义的bean .
所以实例化顺序是root是应用程序上下文,然后是FrameworkServlet .
现在它清楚地说明了为什么它们在哪种情况下很重要 .
还有一点我想补充一点 . 在
spring-servlet.xml
中,我们包括Controller包的组件扫描 . 在下面的示例中,我们包含控制器包的过滤器注释 .在
applicationcontext.xml
中,我们为除控制器之外的剩余包添加过滤器 .简单来说,
applicationContext.xml
定义了所有servlet之间共享的bean . 如果您的应用程序有多个servlet,那么在applicationContext.xml
中定义公共资源会更有意义 .spring-servlet.xml
定义仅与该servlet相关的bean . 这是调度程序servlet . 因此,必须在此文件中定义Spring MVC控制器 .如果在Web应用程序中只运行一个servlet,则定义
spring-servlet.xml
中的所有bean没有任何问题 .应用程序上下文提供了解析文本消息的方法,包括支持这些消息的i18n . 应用程序上下文提供了加载文件资源(如图像)的通用方法 . 应用程序上下文可以将事件发布到注册为侦听器的bean . 容器中的某些操作或容器中的bean(必须以bean工厂以编程方式处理)可以在应用程序上下文中以声明方式处理 . ResourceLoader支持:Spring的Resource接口是一个灵活的通用抽象,用于处理低级资源 . 应用程序上下文本身是ResourceLoader,因此为应用程序提供对特定于部署的Resource实例的访问 . MessageSource支持:应用程序上下文实现MessageSource,一个用于获取本地化消息的接口,实际的实现是可插入的
在Servlet技术中,如果你想要的话要将任何输入传递给特定的servlet,您需要传递init param,如下面的代码 .
如果你想传递一些对于所有servlet都很常见的put,那么你需要配置上下文参数 . 例
因此,当我们使用Spring MVC时,我们需要向Spring提供的一些信息提供一些信息,这些信息是DispatcherServlet通过init param提供的 . 所以配置就像休闲一样,这里我们提供spring-servlet.xml作为DispatcherServlet的init参数 .
我们再次需要一些上下文参数 . 这适用于整个应用 . 所以我们可以提供applicationcontext.xml的根上下文配置如下: