在这种情况下为什么我不能使用@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,那么它将变得有用.