每个功能的目的是什么。为什么spring为配置类提供了两种不同的功能?我对两者感到困惑,应该使用哪一个?
答案 0 :(得分:2)
在典型的Spring应用程序中,有2个ApplicationContext
实例,一个实例是所谓的 root 应用程序上下文,第二个(或第三个或...)是 servlet 应用程序上下文。
root 应用程序通常包含共享/通用资源,例如DataSource
,服务,存储库等。 servlet 上下文包含特定于此上下文的bean。 ,通常是诸如视图解析器,处理程序映射,控制器等之类的东西。The servlet context uses the root context as a parent因此可以看到在那里定义的bean(根不知道servlet上下文!)。
在此典型设置中,根上下文由ContextLoaderListener
加载,而servlet上下文由DispatcherServlet
加载。
在过去,人们会写一个web.xml
,其中包含一个servlet-listener
的{{1}}和一个ContextLoaderListener
的{{1}}元素。
servlet
默认情况下,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_3_0.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"
>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- Spring child -->
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
,而ContextLoaderListener
和applicationContext.xml
会加载(因此会加载DispatcherServlet
)。
从Servlet 3.0规范开始,可以用基于Java的配置替换<servlet-name>-servlet.xml
。 Spring已花时间提供已经进行基本配置的基类(例如dispatcher-servlet.xml
和web.xml
的注册)。但是,由于现在是完全基于Java的配置,因此ContextLoaderListener
和DispatcherServlet
都必须提供一系列配置类,因为没有可以检测到的默认类名。
因此ContextLoaderListener
将配置DispatcherServlet
,并且实际上是可选的(您可以返回getRootConfigClasses()
或空数组)。 ContextLoaderListener
将配置null
(并且是必需的)。
答案 1 :(得分:1)
createRootApplicationContext()
The returned context ... will be established as the parent context for any DispatcherServlet application contexts. As such, it typically contains middle-tier services, data sources, etc.
createServletApplicationContext()
The returned context ... typically contains controllers, view resolvers, locale resolvers, and other web-related beans.
servlet和根上下文之间的全面差异解释:What is the difference between ApplicationContext and WebApplicationContext in Spring MVC?