SpringApplicationContextFactory.java
- package org.jbehave.core.steps.spring;
- import org.springframework.beans.factory.support.BeanDefinitionReader;
- import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.ConfigurableApplicationContext;
- import org.springframework.context.annotation.AnnotationConfigApplicationContext;
- import org.springframework.context.support.GenericApplicationContext;
- import org.springframework.core.io.DefaultResourceLoader;
- import org.springframework.core.io.ResourceLoader;
- /**
- * Factory for Spring {@link ApplicationContext} using the specified resources.
- * The resources can be expressed as:
- * <ol>
- * <li>Annotated class names</li>
- * <li>XML location paths</li>
- * </ol>
- * The context will be an instance of {@link AnnotationConfigApplicationContext},
- * if the resources are annotated class names, or
- * {@link GenericApplicationContext} otherwise.
- */
- public class SpringApplicationContextFactory {
- private final ApplicationContext parent;
- private final ClassLoader classLoader;
- private final String[] resources;
- public SpringApplicationContextFactory(String... resources) {
- this(SpringApplicationContextFactory.class.getClassLoader(), resources);
- }
- public SpringApplicationContextFactory(ClassLoader classLoader, String... resources) {
- this(null, classLoader, resources);
- }
- public SpringApplicationContextFactory(ApplicationContext parent, ClassLoader classLoader, String... resources) {
- this.parent = parent;
- this.classLoader = classLoader;
- this.resources = resources;
- }
- /**
- * Creates a configurable application context from the resources provided.
- * The context will be an instance of
- * {@link AnnotationConfigApplicationContext}, if the resources are
- * annotated class names, or {@link GenericApplicationContext} otherwise.
- *
- * @return A ConfigurableApplicationContext
- */
- public ConfigurableApplicationContext createApplicationContext() {
- try {
- // first try to create annotation config application context
- Class<?>[] annotatedClasses = new Class<?>[resources.length];
- for (int i = 0; i < resources.length; i++) {
- annotatedClasses[i] = this.classLoader.loadClass(resources[i]);
- }
- AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(annotatedClasses);
- context.setParent(parent);
- context.setClassLoader(classLoader);
- return context;
- } catch (ClassNotFoundException e) {
- // create generic application context
- GenericApplicationContext context = new GenericApplicationContext(parent);
- context.setClassLoader(classLoader);
- ResourceLoader resourceLoader = new DefaultResourceLoader(classLoader);
- context.setResourceLoader(resourceLoader);
- BeanDefinitionReader reader = new XmlBeanDefinitionReader(context);
- for (String resource : resources) {
- reader.loadBeanDefinitions(resourceLoader.getResource(resource));
- }
- context.refresh();
- return context;
- }
- }
- }