Top Description Fields Constructors Methods
org.springframework.web.context

public Class ContextLoader

extends Object
Class Inheritance
Known Direct Subclasses
org.springframework.web.context.ContextLoaderListener
Imports
java.io.IOException, java.util.ArrayList, .List, .Map, .Properties, java.util.concurrent.ConcurrentHashMap, jakarta.servlet.ServletContext, org.apache.commons.logging.Log, .LogFactory, org.springframework.beans.BeanUtils, org.springframework.context.ApplicationContext, .ApplicationContextException, .ApplicationContextInitializer, .ConfigurableApplicationContext, org.springframework.core.GenericTypeResolver, org.springframework.core.annotation.AnnotationAwareOrderComparator, org.springframework.core.env.ConfigurableEnvironment, org.springframework.core.io.ClassPathResource, org.springframework.core.io.support.PropertiesLoaderUtils, org.springframework.lang.Nullable, org.springframework.util.ClassUtils, .ObjectUtils, .StringUtils

Performs the actual initialization work for the root application context. Called by ContextLoaderListener.

Looks for a "contextClass" parameter at the web.xml context-param level to specify the context class type, falling back to org.springframework.web.context.support.XmlWebApplicationContext if not found. With the default ContextLoader implementation, any context class specified needs to implement the ConfigurableWebApplicationContext interface.

Processes a "contextConfigLocation" context-param and passes its value to the context instance, parsing it into potentially multiple file paths which can be separated by any number of commas and spaces, e.g. "WEB-INF/applicationContext1.xml, WEB-INF/applicationContext2.xml". Ant-style path patterns are supported as well, e.g. "WEB-INF/*Context.xml,WEB-INF/spring*.xml" or "WEB-INF/**/*Context.xml". If not explicitly specified, the context implementation is supposed to use a default location (with XmlWebApplicationContext: "/WEB-INF/applicationContext.xml").

Note

In case of multiple config locations, later bean definitions will override ones defined in previously loaded files, at least when using one of Spring's default ApplicationContext implementations. This can be leveraged to deliberately override certain bean definitions via an extra XML file.

Above and beyond loading the root application context, this class can optionally load or obtain and hook up a shared parent context to the root application context. See the loadParentContext(ServletContext) method for more information.

ContextLoader supports injecting the root web application context via the ContextLoader(WebApplicationContext) constructor, allowing for programmatic configuration in Servlet initializers. See org.springframework.web.WebApplicationInitializer for usage examples.

Authors
Juergen Hoeller, Colin Sampaleanu, Sam Brannen
Since
17.02.2003
See Also
ContextLoaderListener, ConfigurableWebApplicationContext, org.springframework.web.context.support.XmlWebApplicationContext

Field Summary

Modifier and TypeField and Description
public static final String
CONFIG_LOCATION_PARAM

Name of servlet context parameter (i.e., contextConfigLocation) that can specify the config location for the root context, falling back to the implementation's default otherwise.

private WebApplicationContext
context

The root WebApplicationContext instance that this loader manages.

public static final String
CONTEXT_CLASS_PARAM

Config param for the root WebApplicationContext implementation class to use: contextClass.

public static final String
CONTEXT_ID_PARAM

Config param for the root WebApplicationContext id, to be used as serialization id for the underlying BeanFactory: contextId.

public static final String
CONTEXT_INITIALIZER_CLASSES_PARAM

Config param for ApplicationContextInitializer classes to use for initializing the root web application context: contextInitializerClasses.

private final List<ApplicationContextInitializer<ConfigurableApplicationContext>>
contextInitializers

Actual ApplicationContextInitializer instances to apply to the context.

private static volatile WebApplicationContext
currentContext

The 'current' WebApplicationContext, if the ContextLoader class is deployed in the web app ClassLoader itself.

private static final Map<ClassLoader, WebApplicationContext>
currentContextPerThread

Map from (thread context) ClassLoader to corresponding 'current' WebApplicationContext.

private static final String
DEFAULT_STRATEGIES_PATH

Name of the class path resource (relative to the ContextLoader class) that defines ContextLoader's default strategy names.

private static Properties
public static final String
GLOBAL_INITIALIZER_CLASSES_PARAM

Config param for global ApplicationContextInitializer classes to use for initializing all web application contexts in the current application: globalInitializerClasses.

private static final String
INIT_PARAM_DELIMITERS

Any number of these characters are considered delimiters between multiple values in a single init-param String value.

Constructor Summary

AccessConstructor and Description
public
ContextLoader()

Create a new ContextLoader that will create a web application context based on the "contextClass" and "contextConfigLocation" servlet context-params.

public
ContextLoader(WebApplicationContext
the application context to manage
context
)

Create a new ContextLoader with the given application context.

Method Summary

Modifier and TypeMethod and Description
public void
closeWebApplicationContext(ServletContext
the ServletContext that the WebApplicationContext runs in
servletContext
)

Close Spring's web application context for the given servlet context.

protected void
protected WebApplicationContext

Returns:

the root WebApplicationContext
createWebApplicationContext
(ServletContext
current servlet context
sc
)

Instantiate the root WebApplicationContext for this loader, either the default context class or a custom context class if specified.

protected void
customizeContext(ServletContext
the current servlet context
sc
,
ConfigurableWebApplicationContext
the newly created application context
wac
)

Customize the ConfigurableWebApplicationContext created by this ContextLoader after config locations have been supplied to the context but before the context is refreshed.

protected Class<?>

Returns:

the WebApplicationContext implementation class to use
determineContextClass
(ServletContext
current servlet context
servletContext
)

Return the WebApplicationContext implementation class to use, either the default XmlWebApplicationContext or a custom context class if specified.

protected List<Class<ApplicationContextInitializer<ConfigurableApplicationContext>>>
determineContextInitializerClasses(ServletContext
current servlet context
servletContext
)

Return the ApplicationContextInitializer implementation classes to use if any have been specified by CONTEXT_INITIALIZER_CLASSES_PARAM.

public static WebApplicationContext

Returns:

the current root web application context, or null if none found
getCurrentWebApplicationContext
()

Obtain the Spring root web application context for the current thread (i.e. for the current thread's context ClassLoader, which needs to be the web application's ClassLoader).

public WebApplicationContext

Returns:

the new WebApplicationContext
initWebApplicationContext
(ServletContext
current servlet context
servletContext
)

Initialize Spring's web application context for the given servlet context, using the application context provided at construction time, or creating a new one according to the "contextClass" and "contextConfigLocation" context-params.

private Class<ApplicationContextInitializer<ConfigurableApplicationContext>>
protected ApplicationContext

Returns:

the parent application context, or null if none
loadParentContext
(ServletContext
current servlet context
servletContext
)

Template method with default implementation (which may be overridden by a subclass), to load or obtain an ApplicationContext instance which will be used as the parent context of the root WebApplicationContext.

public void
setContextInitializers(ApplicationContextInitializer<?>... initializers)

Specify which ApplicationContextInitializer instances should be used to initialize the application context used by this ContextLoader.

Inherited from java.lang.Object:
cloneequalsfinalizegetClasshashCodenotifynotifyAlltoStringwaitwaitwait

Field Detail

CONFIG_LOCATION_PARAMback to summary
public static final String CONFIG_LOCATION_PARAM

Name of servlet context parameter (i.e., contextConfigLocation) that can specify the config location for the root context, falling back to the implementation's default otherwise.

See Also
org.springframework.web.context.support.XmlWebApplicationContext#DEFAULT_CONFIG_LOCATION
contextback to summary
private WebApplicationContext context

The root WebApplicationContext instance that this loader manages.

Annotations
@Nullable
CONTEXT_CLASS_PARAMback to summary
public static final String CONTEXT_CLASS_PARAM

Config param for the root WebApplicationContext implementation class to use: contextClass.

See Also
determineContextClass(ServletContext)
CONTEXT_ID_PARAMback to summary
public static final String CONTEXT_ID_PARAM

Config param for the root WebApplicationContext id, to be used as serialization id for the underlying BeanFactory: contextId.

CONTEXT_INITIALIZER_CLASSES_PARAMback to summary
public static final String CONTEXT_INITIALIZER_CLASSES_PARAM

Config param for ApplicationContextInitializer classes to use for initializing the root web application context: contextInitializerClasses.

See Also
customizeContext(ServletContext, ConfigurableWebApplicationContext)
contextInitializersback to summary
private final List<ApplicationContextInitializer<ConfigurableApplicationContext>> contextInitializers

Actual ApplicationContextInitializer instances to apply to the context.

currentContextback to summary
private static volatile WebApplicationContext currentContext

The 'current' WebApplicationContext, if the ContextLoader class is deployed in the web app ClassLoader itself.

Annotations
@Nullable
currentContextPerThreadback to summary
private static final Map<ClassLoader, WebApplicationContext> currentContextPerThread

Map from (thread context) ClassLoader to corresponding 'current' WebApplicationContext.

DEFAULT_STRATEGIES_PATHback to summary
private static final String DEFAULT_STRATEGIES_PATH

Name of the class path resource (relative to the ContextLoader class) that defines ContextLoader's default strategy names.

defaultStrategiesback to summary
private static Properties defaultStrategies
Annotations
@Nullable
GLOBAL_INITIALIZER_CLASSES_PARAMback to summary
public static final String GLOBAL_INITIALIZER_CLASSES_PARAM

Config param for global ApplicationContextInitializer classes to use for initializing all web application contexts in the current application: globalInitializerClasses.

See Also
customizeContext(ServletContext, ConfigurableWebApplicationContext)
INIT_PARAM_DELIMITERSback to summary
private static final String INIT_PARAM_DELIMITERS

Any number of these characters are considered delimiters between multiple values in a single init-param String value.

Constructor Detail

ContextLoaderback to summary
public ContextLoader()

Create a new ContextLoader that will create a web application context based on the "contextClass" and "contextConfigLocation" servlet context-params. See class-level documentation for details on default values for each.

This constructor is typically used when declaring the ContextLoaderListener subclass as a <listener> within web.xml, as a no-arg constructor is required.

The created application context will be registered into the ServletContext under the attribute name WebApplicationContext#ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE and subclasses are free to call the closeWebApplicationContext method on container shutdown to close the application context.

See Also
ContextLoader(WebApplicationContext), initWebApplicationContext(ServletContext), closeWebApplicationContext(ServletContext)
ContextLoaderback to summary
public ContextLoader(WebApplicationContext context)

Create a new ContextLoader with the given application context. This constructor is useful in Servlet initializers where instance-based registration of listeners is possible through the ServletContext#addListener API.

The context may or may not yet be refreshed. If it (a) is an implementation of ConfigurableWebApplicationContext and (b) has not already been refreshed (the recommended approach), then the following will occur:

  • If the given context has not already been assigned an id, one will be assigned to it
  • ServletContext and ServletConfig objects will be delegated to the application context
  • customizeContext will be called
  • Any ApplicationContextInitializers specified through the "contextInitializerClasses" init-param will be applied.
  • refresh() will be called
If the context has already been refreshed or does not implement ConfigurableWebApplicationContext, none of the above will occur under the assumption that the user has performed these actions (or not) per his or her specific needs.

See org.springframework.web.WebApplicationInitializer for usage examples.

In any case, the given application context will be registered into the ServletContext under the attribute name WebApplicationContext#ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE and subclasses are free to call the closeWebApplicationContext method on container shutdown to close the application context.

Parameters
context:WebApplicationContext

the application context to manage

See Also
initWebApplicationContext(ServletContext), closeWebApplicationContext(ServletContext)

Method Detail

closeWebApplicationContextback to summary
public void closeWebApplicationContext(ServletContext servletContext)

Close Spring's web application context for the given servlet context.

If overriding loadParentContext(ServletContext), you may have to override this method as well.

Parameters
servletContext:ServletContext

the ServletContext that the WebApplicationContext runs in

configureAndRefreshWebApplicationContextback to summary
protected void configureAndRefreshWebApplicationContext(ConfigurableWebApplicationContext wac, ServletContext sc)
createWebApplicationContextback to summary
protected WebApplicationContext createWebApplicationContext(ServletContext sc)

Instantiate the root WebApplicationContext for this loader, either the default context class or a custom context class if specified.

This implementation expects custom contexts to implement the ConfigurableWebApplicationContext interface. Can be overridden in subclasses.

In addition, customizeContext gets called prior to refreshing the context, allowing subclasses to perform custom modifications to the context.

Parameters
sc:ServletContext

current servlet context

Returns:WebApplicationContext

the root WebApplicationContext

See Also
ConfigurableWebApplicationContext
customizeContextback to summary
protected void customizeContext(ServletContext sc, ConfigurableWebApplicationContext wac)

Customize the ConfigurableWebApplicationContext created by this ContextLoader after config locations have been supplied to the context but before the context is refreshed.

The default implementation determines what (if any) context initializer classes have been specified through context init parameters and invokes each with the given web application context.

Any ApplicationContextInitializers implementing Ordered or marked with @Order will be sorted appropriately.

Parameters
sc:ServletContext

the current servlet context

wac:ConfigurableWebApplicationContext

the newly created application context

See Also
CONTEXT_INITIALIZER_CLASSES_PARAM, ApplicationContextInitializer#initialize(ConfigurableApplicationContext)
determineContextClassback to summary
protected Class<?> determineContextClass(ServletContext servletContext)

Return the WebApplicationContext implementation class to use, either the default XmlWebApplicationContext or a custom context class if specified.

Parameters
servletContext:ServletContext

current servlet context

Returns:Class<?>

the WebApplicationContext implementation class to use

See Also
CONTEXT_CLASS_PARAM, org.springframework.web.context.support.XmlWebApplicationContext
determineContextInitializerClassesback to summary
protected List<Class<ApplicationContextInitializer<ConfigurableApplicationContext>>> determineContextInitializerClasses(ServletContext servletContext)

Return the ApplicationContextInitializer implementation classes to use if any have been specified by CONTEXT_INITIALIZER_CLASSES_PARAM.

Parameters
servletContext:ServletContext

current servlet context

See Also
CONTEXT_INITIALIZER_CLASSES_PARAM
getCurrentWebApplicationContextback to summary
public static WebApplicationContext getCurrentWebApplicationContext()

Obtain the Spring root web application context for the current thread (i.e. for the current thread's context ClassLoader, which needs to be the web application's ClassLoader).

Returns:WebApplicationContext

the current root web application context, or null if none found

Annotations
@Nullable
See Also
org.springframework.web.context.support.SpringBeanAutowiringSupport
initWebApplicationContextback to summary
public WebApplicationContext initWebApplicationContext(ServletContext servletContext)

Initialize Spring's web application context for the given servlet context, using the application context provided at construction time, or creating a new one according to the "contextClass" and "contextConfigLocation" context-params.

Parameters
servletContext:ServletContext

current servlet context

Returns:WebApplicationContext

the new WebApplicationContext

See Also
ContextLoader(WebApplicationContext), CONTEXT_CLASS_PARAM, CONFIG_LOCATION_PARAM
loadInitializerClassback to summary
private Class<ApplicationContextInitializer<ConfigurableApplicationContext>> loadInitializerClass(String className)
Annotations
@SuppressWarnings:unchecked
loadParentContextback to summary
protected ApplicationContext loadParentContext(ServletContext servletContext)

Template method with default implementation (which may be overridden by a subclass), to load or obtain an ApplicationContext instance which will be used as the parent context of the root WebApplicationContext. If the return value from the method is null, no parent context is set.

The main reason to load a parent context here is to allow multiple root web application contexts to all be children of a shared EAR context, or alternately to also share the same parent context that is visible to EJBs. For pure web applications, there is usually no need to worry about having a parent context to the root web application context.

The default implementation simply returns null, as of 5.0.

Parameters
servletContext:ServletContext

current servlet context

Returns:ApplicationContext

the parent application context, or null if none

Annotations
@Nullable
setContextInitializersback to summary
public void setContextInitializers(ApplicationContextInitializer<?>... initializers)

Specify which ApplicationContextInitializer instances should be used to initialize the application context used by this ContextLoader.

Annotations
@SuppressWarnings:unchecked
Since
4.2
See Also
configureAndRefreshWebApplicationContext, customizeContext