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

  • 在Spring框架中applicationContext.xmlspring-servlet.xml是否有任何关联?< br / >
  • applicationContext.xml中声明的属性文件对DispatcherServlet可用吗?< br / >
  • 在一个相关的注意,为什么我需要*-servlet.xml ?为什么applicationContext.xml单独是不够的?
179496 次浏览

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

applicationContext.xml定义了“根webapp上下文”的bean,即与webapp相关的上下文。

spring-servlet.xml(或者其他任何你称之为它的东西)定义了一个servlet的应用程序上下文的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上下文是不必要的。它通常用于包含在web应用程序中所有servlet之间共享的bean。如果您只有一个servlet,那么没有什么意义,除非您对它有特定的用途。

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

场景1

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

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


context.getBean(name);

不需要web . xml。ApplicationContext作为获取bean服务的容器。不需要web服务器容器。 在test-client.xml中可以存在没有remoting的Simple bean和带有remoting的bean

结论:在场景1中,applicationContext和DispatcherServlet不相关。

场景2

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

web . xml中定义监听器

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

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

假设你已经在中定义了以下内容:

<import resource="test1.xml" />
<import resource="test2.xml" />
<import resource="test3.xml" />
<import resource="test4.xml" />

bean从所有四个配置文件test1.xmltest2 . xmltest3.xmltest4.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

在web应用程序与spring MVC。springweb-servlet.xml用于servlet, 用于访问服务器程序中的业务服务或访问另一个服务器程序中的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实例化在中定义的bean;假设您已在此声明:

<import resource="test1.xml" />
<import resource="test2.xml" />
<import resource="test3.xml" />
<import resource="test4.xml" />
这些bean都是从所有四个test1.xmltest2 . xmltest3.xmltest4.xml实例化的。 在中定义的bean实例化完成后,springweb-servlet.xml中定义的bean将被实例化

因此实例化顺序是:根(应用程序上下文),然后是FrameworkServlet。

现在应该很清楚为什么它们在哪种情况下很重要了。

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

简单地说,

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

spring-servlet.xml定义了仅与该servlet相关的bean。这里是dispatcher servlet。所以,你的Spring MVC控制器必须在这个文件中定义。

如果你在你的web应用程序中只运行一个servlet,那么在spring-servlet.xml中定义所有的bean并没有错。

在Servlet技术中,如果你想将任何输入传递给特定的Servlet,那么你需要像下面的代码一样传入初始化参数。

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

如果您想在put中传递一些对所有servlet都通用的参数,那么此时您需要配置上下文参数。例子

 <context-param>
<param-name>email</param-name>
<param-value>admin@example.com</param-value>
</context-param>
就像这样,当我们使用Spring MVC时,我们需要通过init参数向Spring提供的DispatcherServlet提供一些信息。 所以这个配置是休耕的,这里我们提供spring-servlet.xml作为DispatcherServlet的初始参数
 <?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>