/* * Copyright 2002-2011 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. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.springframework.test.context; import org.springframework.context.ApplicationContext; /** *
Strategy interface for loading an {@link ApplicationContext application context} * for an integration test managed by the Spring TestContext Framework. * *
The SmartContextLoader
SPI supersedes the {@link ContextLoader}
* SPI introduced in Spring 2.5: SmartContextLoaders
can process both
* resource locations and configuration classes. Furthermore, a
* SmartContextLoader
can set active bean definition profiles
* in the context that it loads (see {@link MergedContextConfiguration#getActiveProfiles()}
* and {@link #loadContext(MergedContextConfiguration)}).
*
*
Clients of a SmartContextLoader
should call
* {@link #processContextConfiguration(ContextConfigurationAttributes) processContextConfiguration()}
* prior to calling {@link #loadContext(MergedContextConfiguration) loadContext()}
* in case the SmartContextLoader
provides custom support for modifying
* or generating resource locations or configuration classes. The results of
* {@link #processContextConfiguration(ContextConfigurationAttributes) processContextConfiguration()}
* should be merged for all classes in the hierarchy of the root test class and
* then supplied to {@link #loadContext(MergedContextConfiguration) loadContext()}.
* Even though SmartContextLoader
extends ContextLoader
,
* clients should favor SmartContextLoader
-specific methods over those
* defined in ContextLoader
, particularly because a
* SmartContextLoader
may choose not to support methods defined in
* the ContextLoader
SPI.
*
*
Concrete implementations must provide a public
no-args constructor.
*
*
Spring provides the following out-of-the-box implementations: *
SmartContextLoader
generates default resource
* locations or
* {@link org.springframework.context.annotation.Configuration configuration classes}
* if the locations
or classes
* present in the {@link ContextConfigurationAttributes} provided to
* {@link #processContextConfiguration()} are null
or empty.
* Returning a value of true
signals not only that this
* SmartContextLoader
generates defaults but also that it will
* preemptively verify that a generated default actually exists.
* @return true
if this SmartContextLoader
* generates default configuration locations or classes
* @see #processContextConfiguration(ContextConfigurationAttributes)
*/
boolean generatesDefaults();
/**
* Processes the {@link ContextConfigurationAttributes} for a given test class.
*
Concrete implementations may choose to modify the locations
* or classes
in the supplied {@link ContextConfigurationAttributes}
* or generate default configuration locations or classes if the
* supplied values are null
or empty.
*
Note: If {@link #generatesDefaults()} returns true
,
* this method must preemptively verify that a generated default
* actually exists before setting the corresponding locations
* or classes
property in the supplied
* {@link ContextConfigurationAttributes}. Consequently, leaving the
* locations
or classes
property empty signals that
* this SmartContextLoader
was not able to generate defaults.
* @param configAttributes the context configuration attributes to process
* @see #generatesDefaults()
*/
void processContextConfiguration(ContextConfigurationAttributes configAttributes);
/**
* TODO Document supports(MergedContextConfiguration).
*
* @param mergedConfig
* @return
*/
boolean supports(MergedContextConfiguration mergedConfig);
/**
* Loads a new {@link ApplicationContext context} based on the supplied
* {@link MergedContextConfiguration merged context configuration},
* configures the context, and finally returns the context in a fully
* refreshed state.
*
Concrete implementations should register annotation configuration
* processors with bean factories of
* {@link ApplicationContext application contexts} loaded by this
* SmartContextLoader
. Beans will therefore automatically be
* candidates for annotation-based dependency injection using
* {@link org.springframework.beans.factory.annotation.Autowired @Autowired},
* {@link javax.annotation.Resource @Resource}, and
* {@link javax.inject.Inject @Inject}. In addition, concrete implementations
* should set the active bean definition profiles in the context's
* {@link org.springframework.core.env.Environment Environment}.
*
Any ApplicationContext
loaded by a
* SmartContextLoader
must register a JVM
* shutdown hook for itself. Unless the context gets closed early, all context
* instances will be automatically closed on JVM shutdown. This allows for
* freeing external resources held by beans within the context (e.g.,
* temporary files).
* @param mergedConfig the merged context configuration to use to load the
* application context
* @return a new application context
* @throws Exception if context loading failed
* @see #processContextConfiguration(ContextConfigurationAttributes)
* @see org.springframework.context.annotation.AnnotationConfigUtils#registerAnnotationConfigProcessors()
* @see org.springframework.test.context.MergedContextConfiguration#getActiveProfiles()
* @see org.springframework.context.ConfigurableApplicationContext#getEnvironment()
*/
ApplicationContext loadContext(MergedContextConfiguration mergedConfig) throws Exception;
}