AbstractAnnotationConfigDispatcherServletInitializer中的getRootConfigClasses()和getServletConfigClasses()之间的区别

时间:2019-06-14 07:01:23

标签: java spring spring-boot spring-mvc spring-java-config

每个功能的目的是什么。为什么spring为配置类提供了两种不同的功能?我对两者感到困惑,应该使用哪一个?

2 个答案:

答案 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> ,而ContextLoaderListenerapplicationContext.xml会加载(因此会加载DispatcherServlet)。

从Servlet 3.0规范开始,可以用基于Java的配置替换<servlet-name>-servlet.xml。 Spring已花时间提供已经进行基本配置的基类(例如dispatcher-servlet.xmlweb.xml的注册)。但是,由于现在是完全基于Java的配置,因此ContextLoaderListenerDispatcherServlet都必须提供一系列配置类,因为没有可以检测到的默认类名。

因此ContextLoaderListener将配置DispatcherServlet,并且实际上是可选的(您可以返回getRootConfigClasses()或空数组)。 ContextLoaderListener将配置null(并且是必需的)。

答案 1 :(得分:1)

https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/servlet/support/AbstractAnnotationConfigDispatcherServletInitializer.html

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?