@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", "Bob", "Carol"); } } 

生成BookingService的两种方法不一样吗?

@Bean@Autowired做了两件截然不同的事情。 这里的其他答案更详细地解释,但更简单的说明:

  • @Bean告诉Spring’这是这个类的一个实例,请保持它并在我问的时候把它还给我。

  • @Autowired说’请给我一个这个类的实例,例如,我之前使用@Bean注释创建的@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有用。

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

注释@Bean仅在spring应用程序上下文中将此服务注册为bean(即一种Object)。 简单来说,它只是注册,但没有。

 @Autowired BookingService bookingService; 

使用@Autowired注释变量从Spring Application Context注入一个BookingService bean(即Object)。

IE,@Bean的注册bean将注入使用@Autowired注释的变量。

希望这能说清楚你的疑惑!

@DaveyDaveDave的精彩答案在示例中而不是

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

您可以在BookingService类上使用@Service注释

关于@Autowired注释的好文章http://www.baeldung.com/spring-autowire

@Autowired注释可以通过在配置类上定义@ComponentScan(“namespace.with.your.components.for.inject”)来实例化您的注入

 @Configuration @ComponentScan("com.baeldung.autowire.sample") public class AppConfig {} 

所有组件必须由@Component注释标记。 它取代了@Bean。