java – @Bean和@Autowired不同

前端之家收集整理的这篇文章主要介绍了java – @Bean和@Autowired不同前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在这种情况下为什么我不能使用@Autowired
  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. }

但可以使用@Bean

  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","Carol");
  13. }
  14. }

是不是生成BookingService的两种方式是一样的?

解决方法

@Bean和@Autowired做了两个非常不同的事情.其他答案在这里更详细地解释,但是在一个更简单的层面:

> @Bean告诉Spring这里是这个类的一个实例,请保持它,并在我问’时给它回来.
> @Autowired说’请给我一个这个类的一个例子,比如我之前用@Bean注释创建的.

那有意义吗?在你的第一个例子中,你要求Spring给你一个BookingService的一个实例,但是你永远不会创建一个,所以Spring没有什么可以给你的.在第二个例子中,您正在创建一个BookingService的新实例,告诉Spring它,然后在main()方法中请求它.

如果需要,可以从第二个main()方法删除两个附加行,并将以下两个示例合并:

  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","Carol");
  14. }
  15. }

在这种情况下,@Bean注释给了Spring的BookingService,而@Autowired则使用它.

这将是一个没有意义的例子,因为您正在同一个类中使用它,但如果您在一个类中定义了@Bean,而在另一个类中定义了@Autowired,那么它将变得有用.

猜你在找的Java相关文章