/* * 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: *

* * @author Sam Brannen * @since 3.1 * @see ContextConfiguration * @see ActiveProfiles * @see ContextConfigurationAttributes * @see MergedContextConfiguration */ public interface SmartContextLoader extends ContextLoader { /** * Determines if this 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; }