AbstractContextLoaderInitializer and AbstractDispatcherServletInitializer support ApplicationContextInitializers now
Issue: SPR-12430
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2014 the original author or authors.
|
||||
* Copyright 2002-2015 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -22,6 +22,7 @@ import javax.servlet.ServletException;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
|
||||
import org.springframework.context.ApplicationContextInitializer;
|
||||
import org.springframework.web.WebApplicationInitializer;
|
||||
|
||||
/**
|
||||
@@ -34,6 +35,7 @@ import org.springframework.web.WebApplicationInitializer;
|
||||
*
|
||||
* @author Arjen Poutsma
|
||||
* @author Chris Beams
|
||||
* @author Juergen Hoeller
|
||||
* @since 3.2
|
||||
*/
|
||||
public abstract class AbstractContextLoaderInitializer implements WebApplicationInitializer {
|
||||
@@ -56,7 +58,9 @@ public abstract class AbstractContextLoaderInitializer implements WebApplication
|
||||
protected void registerContextLoaderListener(ServletContext servletContext) {
|
||||
WebApplicationContext rootAppContext = createRootApplicationContext();
|
||||
if (rootAppContext != null) {
|
||||
servletContext.addListener(new ContextLoaderListener(rootAppContext));
|
||||
ContextLoaderListener listener = new ContextLoaderListener(rootAppContext);
|
||||
listener.setContextInitializers(getRootApplicationContextInitializers());
|
||||
servletContext.addListener(listener);
|
||||
}
|
||||
else {
|
||||
logger.debug("No ContextLoaderListener registered, as " +
|
||||
@@ -77,4 +81,15 @@ public abstract class AbstractContextLoaderInitializer implements WebApplication
|
||||
*/
|
||||
protected abstract WebApplicationContext createRootApplicationContext();
|
||||
|
||||
/**
|
||||
* Specify application context initializers to be applied to the root application
|
||||
* context that the {@code ContextLoaderListener} is being created with.
|
||||
* @since 4.2
|
||||
* @see #createRootApplicationContext()
|
||||
* @see ContextLoaderListener#setContextInitializers
|
||||
*/
|
||||
protected ApplicationContextInitializer<?>[] getRootApplicationContextInitializers() {
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2014 the original author or authors.
|
||||
* Copyright 2002-2015 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -193,6 +193,7 @@ public class ContextLoader {
|
||||
*/
|
||||
private static volatile WebApplicationContext currentContext;
|
||||
|
||||
|
||||
/**
|
||||
* The root WebApplicationContext instance that this loader manages.
|
||||
*/
|
||||
@@ -204,6 +205,10 @@ public class ContextLoader {
|
||||
*/
|
||||
private BeanFactoryReference parentContextRef;
|
||||
|
||||
/** Actual ApplicationContextInitializer instances to apply to the context */
|
||||
private final List<ApplicationContextInitializer<ConfigurableApplicationContext>> contextInitializers =
|
||||
new ArrayList<ApplicationContextInitializer<ConfigurableApplicationContext>>();
|
||||
|
||||
|
||||
/**
|
||||
* Create a new {@code ContextLoader} that will create a web application context
|
||||
@@ -260,6 +265,24 @@ public class ContextLoader {
|
||||
this.context = context;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Specify which {@link ApplicationContextInitializer} instances should be used
|
||||
* to initialize the application context used by this {@code ContextLoader}.
|
||||
* @since 4.2
|
||||
* @see #configureAndRefreshWebApplicationContext
|
||||
* @see #customizeContext
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public void setContextInitializers(ApplicationContextInitializer<?>... initializers) {
|
||||
if (initializers != null) {
|
||||
for (ApplicationContextInitializer<?> initializer : initializers) {
|
||||
this.contextInitializers.add((ApplicationContextInitializer<ConfigurableApplicationContext>) initializer);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Initialize Spring's web application context for the given servlet context,
|
||||
* using the application context provided at construction time, or creating a new one
|
||||
@@ -359,6 +382,37 @@ public class ContextLoader {
|
||||
return (ConfigurableWebApplicationContext) BeanUtils.instantiateClass(contextClass);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the WebApplicationContext implementation class to use, either the
|
||||
* default XmlWebApplicationContext or a custom context class if specified.
|
||||
* @param servletContext current servlet context
|
||||
* @return the WebApplicationContext implementation class to use
|
||||
* @see #CONTEXT_CLASS_PARAM
|
||||
* @see org.springframework.web.context.support.XmlWebApplicationContext
|
||||
*/
|
||||
protected Class<?> determineContextClass(ServletContext servletContext) {
|
||||
String contextClassName = servletContext.getInitParameter(CONTEXT_CLASS_PARAM);
|
||||
if (contextClassName != null) {
|
||||
try {
|
||||
return ClassUtils.forName(contextClassName, ClassUtils.getDefaultClassLoader());
|
||||
}
|
||||
catch (ClassNotFoundException ex) {
|
||||
throw new ApplicationContextException(
|
||||
"Failed to load custom context class [" + contextClassName + "]", ex);
|
||||
}
|
||||
}
|
||||
else {
|
||||
contextClassName = defaultStrategies.getProperty(WebApplicationContext.class.getName());
|
||||
try {
|
||||
return ClassUtils.forName(contextClassName, ContextLoader.class.getClassLoader());
|
||||
}
|
||||
catch (ClassNotFoundException ex) {
|
||||
throw new ApplicationContextException(
|
||||
"Failed to load default context class [" + contextClassName + "]", ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected void configureAndRefreshWebApplicationContext(ConfigurableWebApplicationContext wac, ServletContext sc) {
|
||||
if (ObjectUtils.identityToString(wac).equals(wac.getId())) {
|
||||
// The application context id is still set to its original default value
|
||||
@@ -412,13 +466,6 @@ public class ContextLoader {
|
||||
protected void customizeContext(ServletContext sc, ConfigurableWebApplicationContext wac) {
|
||||
List<Class<ApplicationContextInitializer<ConfigurableApplicationContext>>> initializerClasses =
|
||||
determineContextInitializerClasses(sc);
|
||||
if (initializerClasses.isEmpty()) {
|
||||
// no ApplicationContextInitializers have been declared -> nothing to do
|
||||
return;
|
||||
}
|
||||
|
||||
ArrayList<ApplicationContextInitializer<ConfigurableApplicationContext>> initializerInstances =
|
||||
new ArrayList<ApplicationContextInitializer<ConfigurableApplicationContext>>();
|
||||
|
||||
for (Class<ApplicationContextInitializer<ConfigurableApplicationContext>> initializerClass : initializerClasses) {
|
||||
Class<?> initializerContextClass =
|
||||
@@ -430,46 +477,15 @@ public class ContextLoader {
|
||||
"context loader [%s]: ", initializerClass.getName(), initializerContextClass.getName(),
|
||||
wac.getClass().getName()));
|
||||
}
|
||||
initializerInstances.add(BeanUtils.instantiateClass(initializerClass));
|
||||
this.contextInitializers.add(BeanUtils.instantiateClass(initializerClass));
|
||||
}
|
||||
|
||||
AnnotationAwareOrderComparator.sort(initializerInstances);
|
||||
for (ApplicationContextInitializer<ConfigurableApplicationContext> initializer : initializerInstances) {
|
||||
AnnotationAwareOrderComparator.sort(this.contextInitializers);
|
||||
for (ApplicationContextInitializer<ConfigurableApplicationContext> initializer : this.contextInitializers) {
|
||||
initializer.initialize(wac);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the WebApplicationContext implementation class to use, either the
|
||||
* default XmlWebApplicationContext or a custom context class if specified.
|
||||
* @param servletContext current servlet context
|
||||
* @return the WebApplicationContext implementation class to use
|
||||
* @see #CONTEXT_CLASS_PARAM
|
||||
* @see org.springframework.web.context.support.XmlWebApplicationContext
|
||||
*/
|
||||
protected Class<?> determineContextClass(ServletContext servletContext) {
|
||||
String contextClassName = servletContext.getInitParameter(CONTEXT_CLASS_PARAM);
|
||||
if (contextClassName != null) {
|
||||
try {
|
||||
return ClassUtils.forName(contextClassName, ClassUtils.getDefaultClassLoader());
|
||||
}
|
||||
catch (ClassNotFoundException ex) {
|
||||
throw new ApplicationContextException(
|
||||
"Failed to load custom context class [" + contextClassName + "]", ex);
|
||||
}
|
||||
}
|
||||
else {
|
||||
contextClassName = defaultStrategies.getProperty(WebApplicationContext.class.getName());
|
||||
try {
|
||||
return ClassUtils.forName(contextClassName, ContextLoader.class.getClassLoader());
|
||||
}
|
||||
catch (ClassNotFoundException ex) {
|
||||
throw new ApplicationContextException(
|
||||
"Failed to load default context class [" + contextClassName + "]", ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the {@link ApplicationContextInitializer} implementation classes to use
|
||||
* if any have been specified by {@link #CONTEXT_INITIALIZER_CLASSES_PARAM}.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2013 the original author or authors.
|
||||
* Copyright 2002-2015 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -23,18 +23,18 @@ import javax.servlet.ServletContextListener;
|
||||
* Bootstrap listener to start up and shut down Spring's root {@link WebApplicationContext}.
|
||||
* Simply delegates to {@link ContextLoader} as well as to {@link ContextCleanupListener}.
|
||||
*
|
||||
* <p>This listener should be registered after
|
||||
* {@link org.springframework.web.util.Log4jConfigListener}
|
||||
* <p>This listener should be registered after {@link org.springframework.web.util.Log4jConfigListener}
|
||||
* in {@code web.xml}, if the latter is used.
|
||||
*
|
||||
* <p>As of Spring 3.1, {@code ContextLoaderListener} supports injecting the root web
|
||||
* application context via the {@link #ContextLoaderListener(WebApplicationContext)}
|
||||
* constructor, allowing for programmatic configuration in Servlet 3.0+ environments. See
|
||||
* {@link org.springframework.web.WebApplicationInitializer} for usage examples.
|
||||
* constructor, allowing for programmatic configuration in Servlet 3.0+ environments.
|
||||
* See {@link org.springframework.web.WebApplicationInitializer} for usage examples.
|
||||
*
|
||||
* @author Juergen Hoeller
|
||||
* @author Chris Beams
|
||||
* @since 17.02.2003
|
||||
* @see #setContextInitializers
|
||||
* @see org.springframework.web.WebApplicationInitializer
|
||||
* @see org.springframework.web.util.Log4jConfigListener
|
||||
*/
|
||||
@@ -98,6 +98,7 @@ public class ContextLoaderListener extends ContextLoader implements ServletConte
|
||||
super(context);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Initialize the root web application context.
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user