diff --git a/README.md b/README.md index 4545b54..7377606 100644 --- a/README.md +++ b/README.md @@ -97,7 +97,7 @@ bindings. Example: public static class TestConfig { @Bean - public MyModule myModule() { + public static MyModule myModule() { return new MyModule(); } @@ -112,6 +112,35 @@ public static class TestConfig { The `Service` was defined in the Guice module `MyModule`, and then it was be bound to the autowired `spam()` method when Spring started. +## Configuration Class Enhancements + +Note that the `Module` bean definition in the example above is +declared in a `static` method. This is intentional and can be used to +avoid accidentally preventing Spring from being able to enhance the +parent `@Configuration` class. The default behaviour for Spring is to +create a proxy for `@Configuration` classes so the `@Bean` methods +can call each other and Spring will preserve the singleton nature of +the bean factory - one bean of each type per bean id. + +If you see logs like this when the context starts: + +``` +Mar 21, 2022 8:30:35 AM org.springframework.context.annotation.ConfigurationClassPostProcessor enhanceConfigurationClasses +INFO: Cannot enhance @Configuration bean definition 'TestConfig' since its singleton instance has been created too early. The typical cause is a non-static @Bean method with a BeanDefinitionRegistryPostProcessor return type: Consider declaring such methods as 'static'. +``` + +that is a sign that you might want to use static methods to define +any beans of type `Module`. It is logged at INFO because Spring +doesn't know if it was intentional or not. Most likely it was +unintentional, and it is better to avoid nasty surprises later +if we can. + +Another way to avoid the warning is to declare the parent class as +`@Configuration(proxyBeanMethods = false)` so that Spring knows that +you don't even want to enhance the class. It's not a bad idea to use +that flag wherever you can because it saves some time on start up +if the proxy doesn't need to be created. + ## Using Guice as an API for accessing a Spring ApplicationContext In this case the main feature is an `Injector` implementation that diff --git a/src/main/java/org/springframework/guice/annotation/ModuleRegistryConfiguration.java b/src/main/java/org/springframework/guice/annotation/ModuleRegistryConfiguration.java index c2ac897..d1d003f 100644 --- a/src/main/java/org/springframework/guice/annotation/ModuleRegistryConfiguration.java +++ b/src/main/java/org/springframework/guice/annotation/ModuleRegistryConfiguration.java @@ -76,7 +76,7 @@ import org.springframework.guice.module.SpringModule; * @author Howard Yuan * */ -@Configuration +@Configuration(proxyBeanMethods = false) @Order(Ordered.HIGHEST_PRECEDENCE) class ModuleRegistryConfiguration implements BeanDefinitionRegistryPostProcessor, ApplicationContextAware { diff --git a/src/test/java/org/springframework/guice/BeanPostProcessorTests.java b/src/test/java/org/springframework/guice/BeanPostProcessorTests.java index 64cef57..523230f 100644 --- a/src/test/java/org/springframework/guice/BeanPostProcessorTests.java +++ b/src/test/java/org/springframework/guice/BeanPostProcessorTests.java @@ -97,7 +97,7 @@ public class BeanPostProcessorTests { static class BeanPostProcessorTestConfig { @Bean - PostProcessorRegistrar postProcessorRegistrar() { + static PostProcessorRegistrar postProcessorRegistrar() { return new PostProcessorRegistrar(); } @@ -112,7 +112,7 @@ public class BeanPostProcessorTests { } @Bean - Module someGuiceModule() { + static Module someGuiceModule() { return new AbstractModule() { @Override diff --git a/src/test/java/org/springframework/guice/BindingAnnotationTests.java b/src/test/java/org/springframework/guice/BindingAnnotationTests.java index f1cbdb3..4751416 100644 --- a/src/test/java/org/springframework/guice/BindingAnnotationTests.java +++ b/src/test/java/org/springframework/guice/BindingAnnotationTests.java @@ -222,7 +222,7 @@ public class BindingAnnotationTests { } @Bean - AbstractModule module() { + static AbstractModule module() { return new AbstractModule() { @Override protected void configure() { diff --git a/src/test/java/org/springframework/guice/BindingDeduplicationTests.java b/src/test/java/org/springframework/guice/BindingDeduplicationTests.java index 73908ac..92dd967 100644 --- a/src/test/java/org/springframework/guice/BindingDeduplicationTests.java +++ b/src/test/java/org/springframework/guice/BindingDeduplicationTests.java @@ -83,7 +83,7 @@ public class BindingDeduplicationTests { } @Bean - Module module() { + static Module module() { return new AbstractModule() { @Override protected void configure() { diff --git a/src/test/java/org/springframework/guice/DuplicateNamesDifferentTypesTests.java b/src/test/java/org/springframework/guice/DuplicateNamesDifferentTypesTests.java index 90f53ac..8b8c2f8 100644 --- a/src/test/java/org/springframework/guice/DuplicateNamesDifferentTypesTests.java +++ b/src/test/java/org/springframework/guice/DuplicateNamesDifferentTypesTests.java @@ -93,7 +93,7 @@ public class DuplicateNamesDifferentTypesTests { static class DuplicateNamesDifferentTypesTestsConfig { @Bean - Module module() { + static Module module() { return new AbstractModule() { @Override protected void configure() { diff --git a/src/test/java/org/springframework/guice/ElementVisitorTests.java b/src/test/java/org/springframework/guice/ElementVisitorTests.java index a676909..4cb4641 100644 --- a/src/test/java/org/springframework/guice/ElementVisitorTests.java +++ b/src/test/java/org/springframework/guice/ElementVisitorTests.java @@ -105,7 +105,7 @@ public class ElementVisitorTests { } @Bean - Module module() { + static Module module() { return new AbstractModule() { @Override protected void configure() { diff --git a/src/test/java/org/springframework/guice/LazyInitializationTests.java b/src/test/java/org/springframework/guice/LazyInitializationTests.java index f0baaaa..727aa99 100644 --- a/src/test/java/org/springframework/guice/LazyInitializationTests.java +++ b/src/test/java/org/springframework/guice/LazyInitializationTests.java @@ -71,7 +71,7 @@ public class LazyInitializationTests { static class GuiceConfig { @Bean - GuiceModule guiceModule() { + static GuiceModule guiceModule() { return new GuiceModule(); } diff --git a/src/test/java/org/springframework/guice/MapWiringTests.java b/src/test/java/org/springframework/guice/MapWiringTests.java index 15944cc..1dbcbd5 100644 --- a/src/test/java/org/springframework/guice/MapWiringTests.java +++ b/src/test/java/org/springframework/guice/MapWiringTests.java @@ -49,7 +49,7 @@ public class MapWiringTests { static class ModulesConfig { @Bean - TestConfig testConfig() { + static TestConfig testConfig() { return new TestConfig(); } diff --git a/src/test/java/org/springframework/guice/ModuleFilteringTests.java b/src/test/java/org/springframework/guice/ModuleFilteringTests.java index 4605dfa..e2a24d0 100644 --- a/src/test/java/org/springframework/guice/ModuleFilteringTests.java +++ b/src/test/java/org/springframework/guice/ModuleFilteringTests.java @@ -93,7 +93,7 @@ public class ModuleFilteringTests { } @Bean - Module module() { + static Module module() { return new AbstractModule() { @Override diff --git a/src/test/java/org/springframework/guice/PrivateModuleTests.java b/src/test/java/org/springframework/guice/PrivateModuleTests.java index aabeccd..43fa942 100644 --- a/src/test/java/org/springframework/guice/PrivateModuleTests.java +++ b/src/test/java/org/springframework/guice/PrivateModuleTests.java @@ -121,7 +121,7 @@ public class PrivateModuleTests { } @Bean - Module module() { + static Module module() { return new AbstractModule() { @Override protected void configure() { diff --git a/src/test/java/org/springframework/guice/PrototypeScopedBeanTests.java b/src/test/java/org/springframework/guice/PrototypeScopedBeanTests.java index 41fc713..eebe716 100644 --- a/src/test/java/org/springframework/guice/PrototypeScopedBeanTests.java +++ b/src/test/java/org/springframework/guice/PrototypeScopedBeanTests.java @@ -49,7 +49,7 @@ public class PrototypeScopedBeanTests { static class ModulesConfig { @Bean - Module guiceModule() { + static Module guiceModule() { return new AbstractModule() { @Override protected void configure() { diff --git a/src/test/java/org/springframework/guice/ProvidesSupplierWiringTests.java b/src/test/java/org/springframework/guice/ProvidesSupplierWiringTests.java index f28c255..ebe061c 100644 --- a/src/test/java/org/springframework/guice/ProvidesSupplierWiringTests.java +++ b/src/test/java/org/springframework/guice/ProvidesSupplierWiringTests.java @@ -71,7 +71,7 @@ public class ProvidesSupplierWiringTests { static class ModulesConfig { @Bean - TestConfig testConfig() { + static TestConfig testConfig() { return new TestConfig(); } diff --git a/src/test/java/org/springframework/guice/ScopingTests.java b/src/test/java/org/springframework/guice/ScopingTests.java index 096dc3f..9abfe6b 100644 --- a/src/test/java/org/springframework/guice/ScopingTests.java +++ b/src/test/java/org/springframework/guice/ScopingTests.java @@ -91,7 +91,7 @@ public class ScopingTests { static class ScopingTestsConfig { @Bean - Module module() { + static Module module() { return new AbstractModule() { @Override protected void configure() { diff --git a/src/test/java/org/springframework/guice/SpringAutowiredCollectionTests.java b/src/test/java/org/springframework/guice/SpringAutowiredCollectionTests.java index f7b2c7a..058f345 100644 --- a/src/test/java/org/springframework/guice/SpringAutowiredCollectionTests.java +++ b/src/test/java/org/springframework/guice/SpringAutowiredCollectionTests.java @@ -61,7 +61,7 @@ public class SpringAutowiredCollectionTests { } @Bean - GuiceModule guiceServiceModule() { + static GuiceModule guiceServiceModule() { return new GuiceModule(); } diff --git a/src/test/java/org/springframework/guice/SuperClassTests.java b/src/test/java/org/springframework/guice/SuperClassTests.java index 0dfa0d4..2cb5a30 100644 --- a/src/test/java/org/springframework/guice/SuperClassTests.java +++ b/src/test/java/org/springframework/guice/SuperClassTests.java @@ -361,7 +361,7 @@ public class SuperClassTests { static class DisableJITConfig { @Bean - AbstractModule disableJITModule() { + static AbstractModule disableJITModule() { return new AbstractModule() { @Override protected void configure() { diff --git a/src/test/java/org/springframework/guice/annotation/EnableGuiceModulesTests.java b/src/test/java/org/springframework/guice/annotation/EnableGuiceModulesTests.java index 5037a2f..9379ea1 100644 --- a/src/test/java/org/springframework/guice/annotation/EnableGuiceModulesTests.java +++ b/src/test/java/org/springframework/guice/annotation/EnableGuiceModulesTests.java @@ -119,7 +119,7 @@ public class EnableGuiceModulesTests { } - @Configuration + @Configuration(proxyBeanMethods = false) @EnableGuiceModules protected static class ModuleConfig extends AbstractModule { @@ -135,12 +135,12 @@ public class EnableGuiceModulesTests { } - @Configuration + @Configuration(proxyBeanMethods = false) @EnableGuiceModules protected static class ModuleBeanConfig { @Bean - public MyModule module() { + public static MyModule module() { return new MyModule(); } @@ -204,7 +204,7 @@ public class EnableGuiceModulesTests { } @Bean - public MyGuiceModule bazModule() { + public static MyGuiceModule bazModule() { return new MyGuiceModule(); } diff --git a/src/test/java/org/springframework/guice/annotation/ModuleBeanWiringTests.java b/src/test/java/org/springframework/guice/annotation/ModuleBeanWiringTests.java index 5bb7a11..e5f0c52 100644 --- a/src/test/java/org/springframework/guice/annotation/ModuleBeanWiringTests.java +++ b/src/test/java/org/springframework/guice/annotation/ModuleBeanWiringTests.java @@ -56,7 +56,7 @@ public class ModuleBeanWiringTests extends AbstractCompleteWiringTests { } @EnableGuiceModules - @Configuration + @Configuration(proxyBeanMethods = false) public static class TestConfig extends AbstractModule { @Autowired diff --git a/src/test/java/org/springframework/guice/annotation/ModuleNamedBeanWiringTests.java b/src/test/java/org/springframework/guice/annotation/ModuleNamedBeanWiringTests.java index 87fda44..e1ee73a 100644 --- a/src/test/java/org/springframework/guice/annotation/ModuleNamedBeanWiringTests.java +++ b/src/test/java/org/springframework/guice/annotation/ModuleNamedBeanWiringTests.java @@ -56,7 +56,7 @@ public class ModuleNamedBeanWiringTests extends AbstractCompleteWiringTests { } @EnableGuiceModules - @Configuration + @Configuration(proxyBeanMethods = false) public static class TestConfig extends AbstractModule { @Autowired diff --git a/src/test/java/org/springframework/guice/module/DevelepmentStageInjectorTest.java b/src/test/java/org/springframework/guice/module/DevelepmentStageInjectorTest.java index 9de2951..6f51c46 100644 --- a/src/test/java/org/springframework/guice/module/DevelepmentStageInjectorTest.java +++ b/src/test/java/org/springframework/guice/module/DevelepmentStageInjectorTest.java @@ -65,7 +65,7 @@ public class DevelepmentStageInjectorTest { static class ModulesConfig { @Bean - TestGuiceModule testGuiceModule() { + static TestGuiceModule testGuiceModule() { return new TestGuiceModule(); } diff --git a/src/test/java/org/springframework/guice/module/SpringModuleWrappedTests.java b/src/test/java/org/springframework/guice/module/SpringModuleWrappedTests.java index 287c280..ea87f74 100644 --- a/src/test/java/org/springframework/guice/module/SpringModuleWrappedTests.java +++ b/src/test/java/org/springframework/guice/module/SpringModuleWrappedTests.java @@ -79,7 +79,7 @@ public class SpringModuleWrappedTests { protected static class ModuleProviderConfig { @Bean - public ProviderModule module() { + public static ProviderModule module() { return new ProviderModule(); }