Difference between @Bean and @Autowired Difference between @Bean and @Autowired java java

Difference between @Bean and @Autowired


@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:

@SpringBootApplicationpublic 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.


@BeanBookingService bookingService() {    return new BookingService();}

Annotating @Bean only registers the service as a bean(kind of an Object) in spring application context. In simple words, it is just registration and nothing else.

@AutowiredBookingService bookingService;

Annotating a variable with @Autowired injects a BookingService bean(i.e Object) from Spring Application Context.

(i.e) The registered bean with @Bean annotation will be injected to the variable annotated with @Autowired.

Hope this clears your doubt!


great answer by @DaveyDaveDaveIn the example instead of

@Bean  BookingService bookingService() {    return new BookingService();  }

You can use @Service annotation on BookingService class