Spring Framework 5.2 has introduced an optimization for @Configuration class processing that can be enabled via an attribute @Configuration(proxyBeanMethods = false).
If you disable proxyBeanMethods the proxy instances are no longer created and calling the method invokes it again (returning a new instance every time).
As a result, you have no guarantee that you're actually injecting the corresponding bean in the context.
Incorrect bean method call example:
@Configuration(proxyBeanMethods = false)
class TestConfiguration {
@Bean
public FirstBean firstBean() {
return new FirstBean();
}
@Bean
public SecondBean secondBean() {
return new SecondBean(firstBean()); // -> incorrect call
}
}
You can set proxyBeanMethods to true or rewrite the code as follows:
@Configuration(proxyBeanMethods = false)
class TestConfiguration {
@Bean
public FirstBean firstBean() {
return new FirstBean();
}
@Bean
public SecondBean secondBean(FirstBean someBean) { // -> correct injected instance
return new SecondBean(someBean);
}
}
Also, the inspection checks @Bean method calls in a class without the @Configuration stereotype (in "bean lite mode"):
@Component
class TestComponent {
@Bean
public FirstBean firstBean() {
return new FirstBean();
}
@Bean
public SecondBean secondBean() {
return new SecondBean(firstBean()); // -> incorrect call
}
}