Why can’t I use @Autowired
in this case?
@SpringBootApplication public class Application { @Autowired BookingService bookingService; public static void main(String[] args) { bookingService.book("Alice", "Bob", "Carol"); } }
but can use @Bean
@SpringBootApplication public class Application { @Bean BookingService bookingService() { return new BookingService(); } public static void main(String[] args) { ApplicationContext ctx = SpringApplication.run(Application.class, args); BookingService bookingService = ctx.getBean(BookingService.class); bookingService.book("Alice", "Bob", "Carol"); } }
Aren’t the two ways to generate BookingService
the same thing?
Advertisement
Answer
@Bean
and @Autowired
do two very different things. The other answers here explain in a little more detail, but at a simpler level:
@Bean
tells Spring ‘here is an instance of this class, please keep hold of it and give it back to me when I ask’.@Autowired
says ‘please give me an instance of this class, for example, one that I created with an@Bean
annotation earlier’.
Does that make sense? In your first example, you’re asking Spring to give you an instance of BookingService
, but you’re never creating one, so Spring has nothing to give you. In your second example, you’re creating a new instance of BookingService
, telling Spring about it, and then, in the main()
method, asking for it back.
If you wanted, you could remove the two additional lines from the second main()
method, and combine your two examples as below:
@SpringBootApplication public class Application { @Autowired BookingService bookingService; @Bean BookingService bookingService() { return new BookingService(); } public static void main(String[] args) { bookingService.book("Alice", "Bob", "Carol"); } }
In this case, the @Bean
annotation gives Spring the BookingService
, and the @Autowired
makes use of it.
This would be a slightly pointless example, as you’re using it all in the same class, but it becomes useful if you have the @Bean
defined in one class, and the @Autowired
in a different one.