java – @Bean和@Autowired不同

前端之家收集整理的这篇文章主要介绍了java – @Bean和@Autowired不同前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在这种情况下为什么我不能使用@Autowired
@SpringBootApplication
public class Application {

    @Autowired
    BookingService bookingService;

    public static void main(String[] args) {
        bookingService.book("Alice","Bob","Carol");
    }
}

但可以使用@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","Carol");
    }
}

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

解决方法

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

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

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

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

@SpringBootApplication
public class Application {

  @Autowired
  BookingService bookingService;

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

  public static void main(String[] args) {
    bookingService.book("Alice","Carol");
  }
}

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

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

猜你在找的Java相关文章