diff --git a/src/main/java/org/springframework/guice/ModuleRegistryConfiguration.java b/src/main/java/org/springframework/guice/ModuleRegistryConfiguration.java index 4fc3f62..ce4a8ea 100644 --- a/src/main/java/org/springframework/guice/ModuleRegistryConfiguration.java +++ b/src/main/java/org/springframework/guice/ModuleRegistryConfiguration.java @@ -22,9 +22,12 @@ import javax.annotation.PostConstruct; import org.springframework.beans.BeansException; import org.springframework.beans.factory.ObjectFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; import com.google.inject.Binding; import com.google.inject.Guice; @@ -34,7 +37,8 @@ import com.google.inject.Module; import com.google.inject.Provider; @Configuration -public class ModuleRegistryConfiguration { +@Order(Ordered.HIGHEST_PRECEDENCE + 10) +public class ModuleRegistryConfiguration implements BeanPostProcessor { @Autowired private ConfigurableListableBeanFactory beanFactory; @@ -66,4 +70,14 @@ public class ModuleRegistryConfiguration { } } + @Override + public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { + return bean; + } + + @Override + public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { + return bean; + } + } \ No newline at end of file diff --git a/src/main/java/org/springframework/guice/SpringInjector.java b/src/main/java/org/springframework/guice/SpringInjector.java index b4acca2..8004d8a 100644 --- a/src/main/java/org/springframework/guice/SpringInjector.java +++ b/src/main/java/org/springframework/guice/SpringInjector.java @@ -18,8 +18,9 @@ import java.util.List; import java.util.Map; import java.util.Set; +import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.beans.factory.support.RootBeanDefinition; -import org.springframework.context.support.GenericApplicationContext; +import org.springframework.context.ApplicationContext; import com.google.inject.Binding; import com.google.inject.Injector; @@ -33,19 +34,19 @@ import com.google.inject.spi.TypeConverterBinding; public class SpringInjector implements Injector { - private GenericApplicationContext context; private Injector injector; + private DefaultListableBeanFactory beanFactory; - public SpringInjector(GenericApplicationContext context) { - this.context = context; + public SpringInjector(ApplicationContext context) { + this.beanFactory = (DefaultListableBeanFactory) context.getAutowireCapableBeanFactory(); if (context.getBeanNamesForType(Injector.class).length>0) { - injector = context.getBean(Injector.class); + this.injector = context.getBean(Injector.class); } } @Override public void injectMembers(Object instance) { - context.getAutowireCapableBeanFactory().autowireBean(instance); + beanFactory.autowireBean(instance); } @Override @@ -53,7 +54,7 @@ public class SpringInjector implements Injector { return new MembersInjector() { @Override public void injectMembers(T instance) { - context.getAutowireCapableBeanFactory().autowireBean(instance); + beanFactory.autowireBean(instance); } }; } @@ -103,18 +104,18 @@ public class SpringInjector implements Injector { @Override public Provider getProvider(Class type) { - if (context.getBeanNamesForType(type).length==0) { + if (beanFactory.getBeanNamesForType(type).length==0) { if (injector!=null && injector.getExistingBinding(Key.get(type))!=null) { return injector.getProvider(type); } // TODO: use prototype scope? - context.getDefaultListableBeanFactory().registerBeanDefinition(type.getSimpleName(), new RootBeanDefinition(type)); + beanFactory.registerBeanDefinition(type.getSimpleName(), new RootBeanDefinition(type)); } final Class cls = type; return new Provider() { @Override public T get() { - return context.getBean(cls); + return beanFactory.getBean(cls); } }; } @@ -129,14 +130,14 @@ public class SpringInjector implements Injector { @Override public T getInstance(Class type) { - if (context.getBeanNamesForType(type).length==0) { + if (beanFactory.getBeanNamesForType(type).length==0) { if (injector!=null && injector.getExistingBinding(Key.get(type))!=null) { return injector.getInstance(type); } // TODO: use prototype scope? - context.getDefaultListableBeanFactory().registerBeanDefinition(type.getSimpleName(), new RootBeanDefinition(type)); + beanFactory.registerBeanDefinition(type.getSimpleName(), new RootBeanDefinition(type)); } - return context.getBean(type); + return beanFactory.getBean(type); } @Override diff --git a/src/main/java/org/springframework/guice/SpringModule.java b/src/main/java/org/springframework/guice/SpringModule.java index d47db34..89e7be3 100644 --- a/src/main/java/org/springframework/guice/SpringModule.java +++ b/src/main/java/org/springframework/guice/SpringModule.java @@ -15,6 +15,7 @@ package org.springframework.guice; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.support.AbstractBeanDefinition; +import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.context.support.GenericApplicationContext; import org.springframework.util.ClassUtils; @@ -28,24 +29,24 @@ import com.google.inject.Provider; */ public class SpringModule implements Module { - private GenericApplicationContext context; + private DefaultListableBeanFactory beanFactory; public SpringModule(GenericApplicationContext context) { - this.context = context; + this.beanFactory = (DefaultListableBeanFactory) context.getAutowireCapableBeanFactory(); } @Override public void configure(Binder binder) { - for (String name : context.getBeanDefinitionNames()) { - BeanDefinition definition = context.getBeanDefinition(name); + for (String name : beanFactory.getBeanDefinitionNames()) { + BeanDefinition definition = beanFactory.getBeanDefinition(name); if (definition.isAutowireCandidate() && definition.getRole() == AbstractBeanDefinition.ROLE_APPLICATION) { - Class type = context.getType(name); + Class type = beanFactory.getType(name); @SuppressWarnings("unchecked") final Class cls = (Class) type; Provider provider = new Provider() { @Override public Object get() { - return context.getBean(cls); + return beanFactory.getBean(cls); } }; for (Class iface : ClassUtils.getAllInterfacesForClass(cls)) {