为什么我不能@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
相同的东西?
@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", "Bob", "Carol"); } }
在这种情况下,@Bean
注释给Spring BookingService
,并@Autowired
使用它.
这将是一个稍微毫无意义的例子,因为你在同一个类中使用它,但是如果你@Bean
在一个类中定义了它,而在另一个类中定义了它,它就会变得有用@Autowired
.
@Bean BookingService bookingService() { return new BookingService(); }
注释@Bean
仅在Spring应用程序上下文中将服务注册为bean(一种Object).简单来说,它只是注册而不是别的.
@Autowired BookingService bookingService;
通过从Spring Application Context @Autowired
注入BookingService
bean(即Object)来注释变量.
(即)带@Bean
注释的已注册bean 将注入带注释的变量@Autowired
.
希望这清除你的怀疑!
@DaveyDaveDave的很好答案在示例中,而不是
@Bean BookingService bookingService() { return new BookingService(); }
您可以在BookingService类上使用@Service批注