@Bean和@Autowired之间的区别

问题描述

@Bean@Autowired做两件事。此处的其他答案将更详细地解释,但更为简单:

  • @Bean 告诉Spring’这是此类的一个实例,请保留该类,并在我询问时将其还给我’。

  • @Autowired说“请给我一个该类的实例,例如,我@Bean之前用注释创建的一个实例”。

那有意义吗?在第一个示例中,你要让Spring给你一个的实例BookingService,但是你从未创建一个实例,因此Spring没有任何东西可以给你。在第二个示例中,你将创建一个的新实例BookingService,将其告知Spring,然后在该main()方法中要求其返回。

如果需要,可以从第二种main()方法删除另外两行,并结合以下两个示例:

  1. @SpringBootApplication
  2. public class Application {
  3. @Autowired
  4. BookingService bookingService;
  5. @Bean
  6. BookingService bookingService() {
  7. return new BookingService();
  8. }
  9. public static void main(String[] args) {
  10. bookingService.book("Alice", "Bob", "Carol");
  11. }
  12. }

在这种情况下,@Bean注释为Spring提供了BookingService,并加以@Autowired利用。

这将是一个毫无意义的示例,因为你都在同一个类中使用它们,但是如果你@Bean在一个类中定义了该类,而在另一个类中定义了它,则它将变得很有用@Autowired

解决方法

为什么@Autowired在这种情况下不能使用?

  1. @SpringBootApplication
  2. public class Application {
  3. @Autowired
  4. BookingService bookingService;
  5. public static void main(String[] args) {
  6. bookingService.book("Alice","Bob","Carol");
  7. }
  8. }

但可以使用 @Bean

  1. @SpringBootApplication
  2. public class Application {
  3. @Bean
  4. BookingService bookingService() {
  5. return new BookingService();
  6. }
  7. public static void main(String[] args) {
  8. ApplicationContext ctx = SpringApplication.run(Application.class,args);
  9. BookingService bookingService = ctx.getBean(BookingService.class);
  10. bookingService.book("Alice","Carol");
  11. }
  12. }

生成BookingService同一事物的两种方式不是吗?

猜你在找的技术问答相关文章

如何检查配对的蓝牙设备是打印机还是扫描仪(Android)
是否允许实体正文进行HTTP DELETE请求?
如何将ZipInputStream转换为InputStream?
java.util.logging Java 8中的变量
PowerMockito.doReturn返回null
Java中的RESTful调用
Swing / Java:如何正确使用getText和setText字符串
特殊字符和重音字符
Android Studio中的ndk.dir错误
错误“找不到主类”