Why can\'t I use @Autowired in this case?
@SpringBootApplication
public class Application {
@Autowired
BookingService bookingService;
Whatever class you have instantiated using @Autowire, you can instantiate it inside a class with @Configuration annotation using @Bean on the method.
Both @Autowire and @Bean are ways to initialize instances of a Class.
The difference is if you use @Bean to instantiate a class, you have more control over the initialization. For example if you are instantiating a Resilience4J Circuit breaker class, if you do it inside a method with @Bean, you have the option of setting all the config using code like this
@Bean
public CircuitBreaker fooCircuitBreaker() {
CircuitBreakerConfig.Builder builder = CircuitBreakerConfig.custom().
slidingWindowSize(xxx).
failureRateThreshold(xxx).
waitDurationInOpenState(xxx)).
ignoreException(e -> {
if (e instanceof HttpStatusCodeException) {
HttpStatusCodeException httpStatusCodeException = (HttpStatusCodeException) e;
if (httpStatusCodeException.getStatusCode().is4xxClientError()) {
return true;
}
}
return false;
});
circuitBreakerRegistry.addConfiguration(xxx, builder.build());
return circuitBreakerRegistry.circuitBreaker(xxx, xxx);
}
In a case like this, using @Bean is obviously a better way.