diff --git a/pom.xml b/pom.xml index e7f3160..da2170b 100644 --- a/pom.xml +++ b/pom.xml @@ -44,6 +44,12 @@ 4.11 test + + org.mockito + mockito-core + 1.10.8 + test + diff --git a/src/main/java/org/springframework/guice/annotation/ModuleRegistryConfiguration.java b/src/main/java/org/springframework/guice/annotation/ModuleRegistryConfiguration.java index b30a806..dd3aa2b 100644 --- a/src/main/java/org/springframework/guice/annotation/ModuleRegistryConfiguration.java +++ b/src/main/java/org/springframework/guice/annotation/ModuleRegistryConfiguration.java @@ -16,6 +16,7 @@ package org.springframework.guice.annotation; import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.Map; import java.util.Map.Entry; import org.springframework.beans.BeansException; @@ -28,6 +29,7 @@ import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.beans.factory.support.RootBeanDefinition; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; +import org.springframework.context.ApplicationContextException; import org.springframework.context.annotation.Configuration; import org.springframework.core.Ordered; import org.springframework.core.annotation.Order; @@ -96,7 +98,16 @@ public class ModuleRegistryConfiguration implements BeanDefinitionRegistryPostPr modules.add(new SpringModule(this.applicationContext)); Injector injector = null; try { - injector = ((DefaultListableBeanFactory) registry).getBean(InjectorFactory.class).createInjector(modules); + Map beansOfType = ((DefaultListableBeanFactory) registry).getBeansOfType(InjectorFactory.class); + if (beansOfType.size() > 1) { + throw new ApplicationContextException("Found multiple beans of type " + InjectorFactory.class.getName() + + " Please ensure that only one InjectorFactory bean is defined. InjectorFactory beans found: " + + beansOfType.keySet()); + } + else if(beansOfType.size() == 1) { + InjectorFactory injectorFactory = beansOfType.values().iterator().next(); + injector = injectorFactory.createInjector(modules); + } } catch (NoSuchBeanDefinitionException e) { } diff --git a/src/test/java/org/springframework/guice/InjectorFactoryTests.java b/src/test/java/org/springframework/guice/InjectorFactoryTests.java new file mode 100644 index 0000000..ec08bb2 --- /dev/null +++ b/src/test/java/org/springframework/guice/InjectorFactoryTests.java @@ -0,0 +1,50 @@ +package org.springframework.guice; + +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mockito; +import org.springframework.context.ApplicationContextException; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.guice.annotation.ModuleRegistryConfiguration; +import org.springframework.guice.injector.InjectorFactory; + +import com.google.inject.Guice; + +public class InjectorFactoryTests { + + static final private InjectorFactory injectorFactory = Mockito.mock(InjectorFactory.class); + + @Before + public void init() { + Mockito.when(injectorFactory.createInjector(Mockito.anyList())).thenReturn(Guice.createInjector()); + } + + @Test + public void testCustomInjectorIsCreated() { + AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(InjectorFactoryConfig.class, ModuleRegistryConfiguration.class); + Mockito.verify(injectorFactory, Mockito.times(1)).createInjector(Mockito.anyList()); + } + + @Test(expected=ApplicationContextException.class) + public void testMultipleInjectorFactoriesThrowsApplicationContextException() { + AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(InjectorFactoryConfig.class, SecondInjectorFactoryConfig.class, ModuleRegistryConfiguration.class); + } + + @Configuration + static class InjectorFactoryConfig { + @Bean + public InjectorFactory injectorFactory() { + return injectorFactory; + } + } + + @Configuration + static class SecondInjectorFactoryConfig { + @Bean + public InjectorFactory injectorFactory2() { + return injectorFactory; + } + } +} \ No newline at end of file