1. 引言
在开发Spring应用时,需要告诉框架在哪里查找bean。当应用启动时,框架会定位并注册所有这些bean以供后续执行。同样,我们也需要定义一个映射,以便将所有针对web应用的入站请求进行处理。
所有Java web框架都是基于servlet API构建的。在web应用中,有三个文件起着至关重要的作用。通常,我们会按照以下顺序链接它们:web.xml -> applicationContext.xml -> spring-servlet.xml**
本文将探讨applicationContext.xml
和spring-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>
ApplicationContext
是BeanFactory
接口的完整超集,因此提供了BeanFactory
的所有功能。它还提供了集成的生命周期管理、自动注册BeanPostProcessor
和BeanFactoryPostProcessor
、方便访问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.xml
由ContextLoaderListener
加载。
spring-servlet.xml
由DispatcherServlet
加载。
必要性
可选
强制
5. 总结
在这篇教程中,我们了解了applicationContext.xml
和spring-servlet.xml
文件,讨论了它们在Spring应用中的角色和职责,并比较了两者。