I\'m curious about how spring injection handles calling methods with the @Bean annotation. If I put a @Bean annotation on a method, and return an i
Yes, Spring does some magic. Check the Spring Docs:
This is where the magic comes in: All
@Configurationclasses 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 @Beans 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
@Beanmethods never get intercepted by the container, not even within@Configurationclasses (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@Beanmethod has standard Java semantics, resulting in an independent instance being returned straight from the factory method itself.