为什么我不能在这种情况下使用 @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", "Bob", "Carol");
}
}
这两种生成方式 BookingService
不是一样的吗?
原文由 zhuochen shen 发布,翻译遵循 CC BY-SA 4.0 许可协议
@Bean
和@Autowired
做两件截然不同的事情。这里的其他答案更详细地解释了一些,但在更简单的层面上:@Bean
告诉 Spring ‘这是这个类的一个实例,请保留它,当我问的时候把它还给我’。@Autowired
说’请给我这个类的一个实例,例如,我用@Bean
注释创建的实例’。那有意义吗?在你的第一个例子中,你要求 Spring 给你一个
BookingService
的实例,但你永远不会创建一个,所以 Spring 没有什么可以给你的。在你的第二个例子中,你正在创建BookingService
的一个新实例,将它告诉 Spring,然后在main()
方法中,要求它回来。如果需要,您可以从第二个
main()
方法中删除另外两行,并将两个示例组合如下:在这种情况下,
@Bean
注释为 Spring 提供BookingService
,而@Autowired
使用它。这将是一个有点毫无意义的例子,因为你在同一个类中使用它,但如果你有
@Bean
在一个类中定义,并且@Autowired
在一个不同的。