1. 引言

在开发Spring应用时,需要告诉框架在哪里查找bean。当应用启动时,框架会定位并注册所有这些bean以供后续执行。同样,我们也需要定义一个映射,以便将所有针对web应用的入站请求进行处理。

所有Java web框架都是基于servlet API构建的。在web应用中,有三个文件起着至关重要的作用。通常,我们会按照以下顺序链接它们:web.xml -> applicationContext.xml -> spring-servlet.xml**

本文将探讨applicationContext.xmlspring-servlet.xml之间的差异。

2. applicationContext.xml

控制反转(IoC)是Spring框架的核心。在启用IoC的框架中,通常由容器负责对象的实例化、创建和删除。在Spring中,applicationContext扮演了IoC容器的角色。

在开发标准J2EE应用时,我们在web.xml文件中声明ContextLoaderListener。此外,还需要定义contextConfigLocation来指示XML配置文件的位置。

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/applicationContext*.xml</param-value>
</context-param>

当应用启动时,Spring加载这个配置文件,并使用它来创建一个WebApplicationContext对象。如果没有contextConfigLocation,系统默认会查找/WEB-INF/applicationContext.xml来加载配置。

简而言之,applicationContext是Spring的中心接口,提供了应用的配置信息。

在这个文件中,我们提供与应用程序相关的配置。通常包括基本的数据源、属性占位符文件以及项目本地化的消息源等功能。

让我们看看示例文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:c="http://www.springframework.org/schema/c"
  xmlns:p="http://www.springframework.org/schema/p"
  xmlns:context="http://www.springframework.org/schema/context"
  xsi:schemaLocation="http://www.springframework.org/schema/beans
  http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
  http://www.springframework.org/schema/context
  http://www.springframework.org/schema/context/spring-context-4.1.xsd">

    <context:property-placeholder location="classpath:/database.properties" />

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="${jdbc.driverClassName}" />
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
        <property name="initialSize" value="5" />
        <property name="maxActive" value="10" />
    </bean>

    <bean id="messageSource"
        class="org.springframework.context.support.ResourceBundleMessageSource">
        <property name="basename" value="messages" />
    </bean>
</beans>

ApplicationContextBeanFactory接口的完整超集,因此提供了BeanFactory的所有功能。它还提供了集成的生命周期管理、自动注册BeanPostProcessorBeanFactoryPostProcessor、方便访问MessageSource以及发布ApplicationEvent

3. spring-servlet.xml

在Spring中,一个前端servlet接收入站请求并将它们委派给适当的控制器方法。根据前端控制器设计模式,前端servlet处理特定web应用的所有HTTP请求。这个前端servlet对入站请求具有完全控制权。

类似地,spring-servlet充当前端控制器servlet,提供单点入口。它接收入站URI。在幕后,它使用HandlerMapping实现来定义请求和处理器对象之间的映射。

让我们看看示例代码:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:mvc="http://www.springframework.org/schema/mvc"
  xmlns:context="http://www.springframework.org/schema/context"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="
    http://www.springframework.org/schema/beans     
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/mvc 
    http://www.springframework.org/schema/mvc/spring-mvc.xsd
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context.xsd">

    <mvc:annotation-driven />
    <context:component-scan base-package="com.baeldung.controller" />

    <bean id="viewResolver"
      class="org.springframework.web.servlet.view.UrlBasedViewResolver">
    <property name="viewClass"
          value="org.springframework.web.servlet.view.JstlView" />
    <property name="prefix" value="/WEB-INF/jsp/" />
    <property name="suffix" value=".jsp" />
    </bean>

</beans>

4. applicationContext.xml vs. spring-servlet.xml

让我们总结一下:

特性

applicationContext.xml

spring-servlet.xml

框架

它是Spring框架的一部分。

它是Spring MVC框架的一部分。

用途

定义Spring bean的容器。

处理入站请求的前端控制器。

范围

它定义在整个servlet中共享的bean。

只定义与特定servlet相关的bean。

管理

它管理全局事物,如数据源,连接工厂在这里定义。

相反,只在其中定义与web相关的事务,如控制器和viewresolver

引用

它不能访问spring-servlet的bean。

它可以访问applicationContext中定义的bean。

共享

整个应用共有的属性放在这里。

仅限于一个servlet的特定属性放在这里。

扫描

我们定义过滤器来包含/排除包。

我们声明控制器的组件扫描。

发生

在一个应用中通常定义多个上下文文件。

在web应用中也可以定义多个文件。

加载

applicationContext.xmlContextLoaderListener加载。

spring-servlet.xmlDispatcherServlet加载。

必要性

可选

强制

5. 总结

在这篇教程中,我们了解了applicationContext.xmlspring-servlet.xml文件,讨论了它们在Spring应用中的角色和职责,并比较了两者。