add support for custom injector creation

This commit is contained in:
Taylor Wicksell
2016-03-04 10:10:37 -08:00
committed by Dave Syer
parent 1002284360
commit df6e0525f1
2 changed files with 37 additions and 9 deletions

View File

@@ -19,6 +19,7 @@ import java.util.List;
import java.util.Map.Entry;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.config.ConstructorArgumentValues;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
@@ -30,6 +31,7 @@ import org.springframework.context.ApplicationContextAware;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.guice.injector.InjectorFactory;
import org.springframework.guice.module.SpringModule;
import com.google.inject.Binding;
@@ -87,18 +89,26 @@ public class ModuleRegistryConfiguration implements BeanDefinitionRegistryPostPr
}
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
List<Module> modules = new ArrayList<Module>(((DefaultListableBeanFactory)registry).getBeansOfType(Module.class).values());
modules.add(new SpringModule(this.applicationContext));
Injector injector = createInjector(modules);
mapBindings(injector, registry);
((ConfigurableListableBeanFactory) registry).registerSingleton(Injector.class.getName(), injector);
}
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
List<Module> modules = new ArrayList<Module>(
((DefaultListableBeanFactory) registry).getBeansOfType(Module.class).values());
modules.add(new SpringModule(this.applicationContext));
Injector injector = null;
try {
injector = ((DefaultListableBeanFactory) registry).getBean(InjectorFactory.class).createInjector(modules);
} catch (NoSuchBeanDefinitionException e) {
}
if (injector == null) {
injector = createInjector(modules);
}
mapBindings(injector, registry);
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext=applicationContext;
}
}
}

View File

@@ -0,0 +1,18 @@
package org.springframework.guice.injector;
import java.util.List;
import org.springframework.guice.annotation.EnableGuiceModules;
import com.google.inject.Injector;
import com.google.inject.Module;
/***
* Factory which allows for custom creation of the Guice Injector to be used
* in the @{@link EnableGuiceModules} feature.
*/
public interface InjectorFactory {
public Injector createInjector(List<Module> modules);
}