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.
努力到无能为力,奋斗到感动上天!