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