Calling a @Bean annotated method in Spring java configuration
Yes, Spring does some magic. Check the Spring Docs:
This is where the magic comes in: All
@Configuration
classes are subclassed at startup-time with CGLIB. In the subclass, the child method checks the container first for any cached (scoped) beans before it calls the parent method and creates a new instance.
This means that the calls to @Bean
methods are proxied via CGLIB and therefore the cached version of the bean is returned (a new one is not created).
The default scope of @Bean
s is SINGLETON
, if you specify a different scope such as PROTOTYPE
the call will be passed to the original method.
Please note that this is not valid for static methods. As per the spring docs:
Calls to static
@Bean
methods never get intercepted by the container, not even within@Configuration
classes (as described earlier in this section), due to technical limitations: CGLIB subclassing can override only non-static methods. As a consequence, a direct call to another@Bean
method has standard Java semantics, resulting in an independent instance being returned straight from the factory method itself.