@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 不是一样的吗?

原文由 zhuochen shen 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 804
2 个回答

@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 在一个不同的。

原文由 DaveyDaveDave 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

注释 @Bean 仅将服务注册为 spring 应用程序上下文中的 bean(一种对象)。简单来说,就是注册而已。

 @Autowired
BookingService bookingService;

使用 @Autowired 注释变量会从 Spring Application Context 注入 BookingService bean(即对象)。

(ie) 带有 @Bean 注释的注册对象将被注入到带有 @Autowired 注释的变量中。

希望这能消除您的疑虑!

原文由 pmverma 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题