Difference between @Bean and @Autowired

Demo01

 1 @SpringBootApplication
 2 public class Application {
 3 
 4     @Autowired
 5     BookingService bookingService;
 6 
 7     public static void main(String[] args) {
 8         bookingService.book("Alice", "Bob", "Carol");
 9     }
10 }

Demo02

 1 @SpringBootApplication
 2 public class Application {
 3 
 4     @Bean
 5     BookingService bookingService() {
 6         return new BookingService();
 7     }
 8 
 9     public static void main(String[] args) {
10         ApplicationContext ctx = SpringApplication.run(Application.class, args);
11         BookingService bookingService = ctx.getBean(BookingService.class);
12         bookingService.book("Alice", "Bob", "Carol");
13     }
14 }

大家可以先思考一下,上面两个demo中,生成的BookingService是否一致呢?

答案是NO!

@Bean 和@Autowired是两个用途不同的注解。

@Bean 它会告诉Spring,这是一个类的实例,先保有它的实例,然后在需要的时候再去调用这个实例。

@Autowired 它告诉Spring,请给我这个类的实例,比如,之前用@Bean注解生成的实例。

明白了吗?我的朋友。在Demo01中,@Autowired让Spring给它一个BookingService的实例,但是之前没有任何地方创建过这个实例,所以肯定会失败。在Demo02中,@Bean创建了这个实例,然后在main方法中,需要使用的地方进行调用。

将Demo01和Demo02进行整合,可以变成Demo03的样子:

 1 @SpringBootApplication
 2 public class Application {
 3 
 4   @Autowired
 5   BookingService bookingService;
 6 
 7   @Bean
 8   BookingService bookingService() {
 9     return new BookingService();
10   }
11 
12   public static void main(String[] args) {
13     bookingService.book("Alice", "Bob", "Carol");
14   }
15 }

 

参考链接:

https://stackoverflow.com/questions/34172888/difference-between-bean-and-autowired#:~:text=Annotating%20%40Bean%20only%20registers%20the,Object)%20from%20Spring%20Application%20Context.

 

posted @ 2020-11-02 21:50  Mr.袋鼠  阅读(108)  评论(0编辑  收藏  举报